2017-04-13 4 views
1

J'ai un client qui a besoin de nous pour utiliser le cryptage Blowfish ECB avec cipherMode 0, sortie 1. J'ai essayé de résoudre pour cela, mais je suis coincé. Comment puis-je réparer mon code?Blowfish ECB cryptage en implémentation C#

Voici les instructions complètes du client:

algorithme: Blowfish · Mode: BCE · Rembourrage: PKCS5Padding * vecteur initial est inutile parce que nous utilisons le mode BCE.

Exemple · Chiffrer clé: 2fs5uhnjcnpxcpg9 → Texte brut: 3280: 99: 20120201123050 → Cipher Texte: daa745f1901364c0bd42b9658db3db96336758cd34b2a576 * S'il vous plaît garder Cipher texte avec 16 caractères hexadécimaux. * Veuillez générer un texte chiffré sans "sel".

Je dois écrire ceci en C#. Voici ce que je l'ai fait, mais il ne semble pas fonctionner:

string member_id = "3280"; 
     string panelType = "99"; 
     string RandomString = "20120201123050"; 
     string encryptionKey = "2fs5uhnjcnpxcpg9"; 
     string cryptstr = member_id + ":" + panelType + ":" + RandomString; 
     string plainText = cryptstr; 
     BlowFish b = new BlowFish(encryptionKey); 
     string cipherText = b.Encrypt_ECB("3280:99:20120201123050"); 

Le résultat est pas daa745f1901364c0bd42b9658db3db96336758cd34b2a576. Où est-ce que je me suis trompé?

+2

Wow, c'est à peu près le pire en matière de sécurité! Même l'auteur de Blowfish ne l'utilise plus, maintenant il utilise AES. N'utilisez pas le mode ECB, il n'est pas sécurisé, voir [Mode ECB] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29), faites défiler vers le bas jusqu'au Penguin. – zaph

+0

Qu'est-ce que vous importez pour obtenir la classe Blowfish? Et comme je ne vous vois pas paramétrer quoi que ce soit pour le remplissage, quel est le document par défaut de la bibliothèque contenant la classe Blowfish? –

+0

Finalement, il est temps de mettre à jour la sécurité, AES est disponible depuis 15 ans, le client devrait vraiment faire un effort, attendre un autre 15 ans serait ridicule. – zaph

Répondre

1

Encrypt_ECB() donc je suppose que sa classe Schneier.

Le cteur attend une chaîne hexadécimale si l'on est passé, vous avez besoin de surcharge pour un tableau d'octets:

BlowFish b = new BlowFish(Encoding.UTF8.GetBytes(encryptionKey)); 

La sortie est toujours pas correcte, permet de voir ce qu'il devrait vraiment être en décryptant leur exemple:

string clear = b.Decrypt_ECB("daa745f1901364c0bd42b9658db3db96336758cd34b2a576"); 

nous donne:

"3280:99:20120201123050\u0002\u0002" 

Ce qui est bon, mais il y a 2 0 x2 octets à la fin, le N x 0xN est dû au remplissage PKCS. Pour obtenir le résultat, vous devez remplir l'entrée:

// input to bytes 
List<byte> clearBytes = new List<byte>(Encoding.UTF8.GetBytes("3280:99:20120201123050")); 

// how many padding bytes? 
int needPaddingBytes = 8 - (clearBytes.Count % 8); 

// add them 
clearBytes.AddRange(Enumerable.Repeat((byte)needPaddingBytes, needPaddingBytes)); 

// encrypt 
byte[] cipherText = b.Encrypt_ECB(clearBytes.ToArray()); 

// to hex 
string cipherTextHex = BitConverter.ToString(cipherText).Replace("-", "").ToLowerInvariant();