2010-11-23 49 views
1

Fondamentalement, comment puis-je crypter en javascript dans CBC/PKCS7 afin que je puisse décrypter en php ou .NET?slowAES ne fonctionne pas avec CBC/PKCS7 - alternatives?

J'ai essayé slowAES mais le texte de sortie chiffré ne semble pas correct.

J'ai comparé le chiffrement slowAES et .NET et donné les mêmes entrées de tableau d'octets (clé, iv et message), slowAES renvoie une sortie de tableau d'octets différente.

J'ai également comparé les résultats avec .NET et mcrypt de php et ils produisent la même sortie.

J'ai essayé ce correctif link text mais cela n'a pas fonctionné. Donc, en supposant qu'il y ait un problème slowAES, existe-t-il une alternative de travail, ou est-ce que quelqu'un sait comment y remédier?

oh, et je peux chiffrer et déchiffrer si je n'utilise que slowAES: x


Mise à jour avec un exemple:

javascript cryptage:

var bytesToEncrypt = cryptoHelpers.convertStringToByteArray("2|2010-11-23+10:04:53|0"); 
// [50, 124, 50, 48, 49, 48, 45, 49, 49, 45, 50, 51, 43, 49, 48, 58, 48, 52, 58, 53, 51, 124, 48] 

var key = cryptoHelpers.base64.decode("de1310982b646af063e7314e8ddd4787"); 
//[117, 237, 119, 215, 79, 124, 217, 190, 184, 233, 167, 244, 235, 119, 187, 223, 94, 30, 241, 215, 93, 227, 191, 59] 

var iv = cryptoHelpers.base64.decode("v/VCTAlV5+kexBFN16WY5A=="); 
//[191, 245, 66, 76, 9, 85, 231, 233, 30, 196, 17, 77, 215, 165, 152, 228] 

var result = slowAES.encrypt(bytesToEncrypt, 
slowAES.modeOfOperation.CBC, 
key, 
slowAES.aes.keySize.SIZE_128, 
iv); 

return result['cipher']; 
//[114, 176, 211, 189, 47, 133, 36, 115, 173, 19, 122, 45, 30, 212, 189, 54, 149, 167, 92, 127, 198, 13, 121, 102, 70, 172, 119, 194, 249, 98, 107, 236] 

Chiffrement .NET/Silverlight:

class AES 
    { 
     AesManaged aes; 

     public AES(string base64key, string base64IV) 
      : this(Convert.FromBase64String(base64key),Convert.FromBase64String(base64IV)) 
     {} 

     public AES(byte[] key, byte[] iv) 
     { 
      // CBC/128/PKCS7 
      aes = new AesManaged(); 
      aes.Key = key; 
      aes.IV = iv; 
     } 
     public string Encrypt(string strInptData) 
     { 
      byte[] utfdata = UTF8Encoding.UTF8.GetBytes(strInptData); 

      PrintByteArray(utfdata); 
// [50, 124, 50, 48, 49, 48, 45, 49, 49, 45, 50, 51, 43, 49, 48, 58, 48, 52, 58, 53, 51, 124, 48] 

      PrintByteArray(aes.Key); 
// [117, 237, 119, 215, 79, 124, 217, 190, 184, 233, 167, 244, 235, 119, 187, 223, 94, 30, 241, 215, 93, 227, 191, 59] 

      PrintByteArray(aes.IV); 
// [191, 245, 66, 76, 9, 85, 231, 233, 30, 196, 17, 77, 215, 165, 152, 228] 

      // Create a decrytor to perform the stream transform. 
      ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV); 

      // Create the streams used for encryption. 
      MemoryStream msEncrypt = new MemoryStream(); 
      CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write); 

      csEncrypt.Write(utfdata, 0, utfdata.Length); 
      csEncrypt.Flush(); 
      csEncrypt.Close(); 

      // Showing our encrypted content 
      byte[] encryptBytes = msEncrypt.ToArray(); 

      PrintByteArray(encryptBytes); 
// [89, 116, 38, 217, 71, 199, 73, 174, 55, 139, 158, 231, 22, 238, 252, 245, 147, 206, 176, 157, 1, 141, 88, 178, 160, 112, 135, 182, 13, 200, 53, 121] 

      return HttpUtility.UrlEncode(Convert.ToBase64String(encryptBytes)); 
     } 
    } 

string base64key = "de1310982b646af063e7314e8ddd4787"; 
string base64iv = "v/VCTAlV5+kexBFN16WY5A=="; 

aes = new AES(base64key, base64iv); 

auth_token = aes.Encrypt("2|2010-11-23+10:04:53|0"); 

Comme vous pouvez le voir .NET et javascript produire des tableaux d'octets différents, donc même pas un base64/url-encode/decode .. thingy

+0

Alors, comment transférer la clé de JavaScript? J'espère que c'est plus de https. – rook

+0

en effet c'est ... – Rui

Répondre

2

Votre clé secrète est de 24 octets (192 bits) à long , mais vous affirmez que c'est seulement 16 octets (128 bits) longue:

var result = slowAES.encrypt(bytesToEncrypt, 
slowAES.modeOfOperation.CBC, 
key, 
slowAES.aes.keySize.SIZE_128, // <- Here is your problem 
iv); 

En changeant SIZE_128-SIZE_192, il devrait fonctionner. J'ai écrit un programme Java qui émet la même sortie que votre exemple JavaScript produit.