2010-11-23 13 views
1

基本的に、CBC/PKCS7のJavaScriptでどのように暗号化すれば、PHPや.NETで復号化できますか?slowAESはCBC/PKCS7の代替案では動作しませんか?

slowAESを試しましたが、出力された出力テキストが正しくないようです。

slowAESと.NETの暗号化を比較して、同じバイト配列入力(key、iv、およびmessage)を両方に渡すと、slowAESは別のバイト配列出力を返します。

また、結果を.NETとphpのmcryptと比較して、同じ出力を生成します。

私はこの修正プログラムを試しましたが、link textが動作しませんでした。

だから、slowAESの問題があると仮定しますか、それともうまくいくのでしょうか?誰かがそれを修正する方法を知っていますか?例とX


更新

ああ、私は唯一のslowAESを使用する場合、私は、暗号化と復号化することができます

javascriptの暗号化:

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] 

.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"); 

は、.NETを見ることができるとJavaScriptを

+0

どのようにしてJavaScriptにキーを転送しますか?私はhttps以上のthatsを願っています。 – rook

+0

本当にそれは... – Rui

答えて

2

あなたの秘密鍵が長い24バイト(192ビット)..ですので、でもBASE64/URLエンコード/デコードブツではない、別のバイト配列を生成したよう、しかし、あなたはそれが唯一の16バイト(128ビット)の長さだと主張している:

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

SIZE_192SIZE_128を変更することにより、それが動作するはずです。私はあなたのJavaScriptの例と同じ出力を出すJavaプログラムを書きました。

関連する問題