L'une des principales vérités de la cryptographie est que vous ne devez rien inventer dans ce domaine si vous n'êtes pas un professionnel. Cela est en partie vrai, car le meilleur a longtemps été inventé, souffert et utilisé pendant des décennies dans le domaine des technologies de l'information. L'autre côté de la vérité est que le développement d'un certain domaine de la connaissance ne se produit qu'avec un afflux constant d'idées nouvelles et de solutions originales.
Pour des raisons évidentes, nous n'escroquerons pas les géants de la cryptographie industrielle comme AES, mais plongeons, pour ainsi dire, dans nos propres enquêtes cryptographiques avec blackjack et joies.
En partie parce que c'est intéressant, en partie parce que lorsque vous modélisez votre propre produit et le comparez avec des normes reconnues, vous pouvez clairement voir le contraste, les solutions efficaces et les omissions franches, vous comprenez ce que vous pouvez faire pour augmenter l'efficacité.
Mais déjà assez d'eau.
Disons que notre application web est écrite en php, a besoin d'un cryptage réversible, et nous pensons que nous pouvons écrire notre propre système de chiffrement.
Nous allons donc écrire notre propre système de cryptage réversible avec une clé privée et publique, qui aura les caractéristiques suivantes d'un algorithme cryptographique légèrement plus sécurisé:
- La présence de caractères de bruit dans le chiffre résultant.
- Les informations de chaque canal de l'expéditeur-destination seront cryptées à l'aide d'une clé privée et la fonction de correspondance sera unique pour chaque clé.
- Chaque message recevra un code de résumé - un code unique qui est fonction de la clé privée et du message d'origine. Ceci est nécessaire pour obtenir l'unicité de la fonction de correspondance "caractère source <=> caractère codé" non seulement pour le canal "Sender-Destination", mais aussi pour chaque message individuel.
Ainsi, même si nous imaginons que la correspondance des symboles codés et source pour un message particulier est devenue connue grâce à l'utilisation de l'analyse cryptographique, par exemple, l'analyse de fréquence, cela ne donne aucune préférence lors de l'examen d'un autre message. - Pour compliquer l'analyse de fréquence, nous allons coder chaque symbole de message source avec deux symboles de chiffrement.
Alors qu'est-ce qui s'est passé.
En fait, vous pouvez voir le résultat final
iciClasse SymCoderLa classe SymCoder comprend des méthodes de chiffrement et de déchiffrement.
Le cryptage est effectué par la méthode code (), qui reçoit le message d'origine à l'entrée.
Ici, le message sur la table de correspondance générée dans tab_coded crée un message crypté, dilué sur les bords et à l'intérieur avec des symboles de bruit.
Soit dit en passant, les symboles de bruit sont uniques pour chaque canal expéditeur-destination, car ils sont générés à l'aide de la clé de canal, mais ne sont pas uniques aux messages. Les caractères utilisés pour le chiffrement dans code_symbols sont des caractères de ponctuation et des caractères comme%, @, etc.
Pour chaque caractère codé, il y a deux caractères de code_symbols pour des raisons évidentes, qu'il y en a plusieurs fois moins que les caractères codés.
La table de correspondance create_tab_coded est construite à l'aide de la traduction du hachage de clé de message dans un tableau avec le nombre d'éléments égal au nombre d'éléments dans le tableau de caractères de code. La position du début du contournement des codes à deux caractères est également toujours différente et est associée à la clé de canal. Cela permet de s'assurer que l'algorithme de contournement des caractères encodés et leur correspondance avec les caractères de code seront toujours (enfin, ou souvent garantis) différents.
Par exemple, le message «hello world» en cours de codage ressemble à ceci:
Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%%.!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!
Et voici à nouveau le même message encodé:
Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%.!%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:
On peut voir que le résumé du même message est le même, mais le chiffre devient différent - des symboles de bruit sont ajoutés par correspondance arbitraire et dans un ordre aléatoire pour chaque nouveau chiffrement.
Les messages ont une redondance, qui diminue à mesure que le volume des messages augmente, atteignant jusqu'à 10% de bruit (pour les messages les plus courts, le bruit atteint 90% et plus), la longueur minimale d'un message chiffré est de 116 caractères. L'un des rares inconvénients de cette méthode de chiffrement est une augmentation doublée des messages codés.
Le décodage est la traduction inverse de la forme «symbole de code» - le symbole original avec le bruit coupé du message. Quelle pourrait être la clé? En principe, toute chaîne unique à chaque paire du type destinataire-destinataire.
Par exemple, si vous créez un messager avec le cryptage des messages, dans ce cas, la version la plus simple de la clé privée peut être md5 ($ user_id_1. $ Salt. $ User_id_2), alors la clé sera unique pour chaque canal de message.