2016-07-12 5 views
1

AESがペイロードを暗号化するWebページと、サイトのクエリー文字列(これは私の選択ではなくクライアントの要求です)で送信する公開キーがあります。解読され、処理される。ここで埋め込みが無効であり、文字列を解読するときに削除できません。

はウェブページです:

<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
    <meta charset="utf-8" /> 
</head> 
<body> 

</body> 

</html> 

<script src="Scripts/CryptoJS/core.js"></script> 
<script src="Scripts/CryptoJS/cipher-core.js"></script> 
<script src="Scripts/CryptoJS/aes.js"></script> 
<script src="Scripts/CryptoJS/enc-utf16.js"></script> 
<script src="Scripts/CryptoJS/enc-base64.js"></script> 

<script> 
    var payload = "you can do this Rick!"; 
    var keyvalue = '1234567890ABCDEF'; 

    var key = CryptoJS.enc.Utf8.parse(keyvalue); 
    var iv = CryptoJS.enc.Utf8.parse(keyvalue); 


    var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(payload), key, 
     { 
      keySize: 128 , 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     }); 

    window.location = "Home/To?encrptedPayload=" + encrypted + "&ivPublicKeyNonEncrypted=" + keyvalue; 

</script> 

はここでコールを受信するコントローラです:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Security.Cryptography; 
using System.Text; 
using System.Web; 
using System.Web.Mvc; 

namespace Workbench2.Controllers 
{ 
    public class HomeController : Controller 
    { 
     byte[] Key = Encoding.UTF8.GetBytes("1234567890ABCDEF"); 

     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult To(string encrptedPayload, string ivPublicKeyNonEncrypted) 
     { 
      string result = ""; 

      var bIv = Encoding.UTF8.GetBytes(ivPublicKeyNonEncrypted); 

      // Create an RijndaelManaged object 
      // with the specified key and IV. 
      using (RijndaelManaged rijAlg = new RijndaelManaged()) 
      { 
       rijAlg.KeySize = 128; 
       rijAlg.Key = Key; 
       rijAlg.IV = bIv; 
       rijAlg.Padding=PaddingMode.PKCS7; 
       rijAlg.Mode=CipherMode.CBC; 

       // Create a decrytor to perform the stream transform. 
       ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);     

       // Create the streams used for decryption. 
       var bPayload = Encoding.UTF8.GetBytes(encrptedPayload); 
       using (MemoryStream msDecrypt = new MemoryStream(bPayload)) 
       { 
        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
        { 
         using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
         { 
          // Read the decrypted bytes from the decrypting stream 
          // and place them in a string. 
          result = srDecrypt.ReadToEnd(); // THIS LINE THROWS ERROR       } 
        } 
       } 

      } 

      return View(result); 
     }    
    } 
} 

私はメッセージを取得「パディングは無効であり、削除することはできません。」次の行が実行されたとき:

result = srDecrypt.ReadToEnd();

+1

暗号化された文字列をURLエンコードすると違いがありますか? – Amy

答えて

1

暗号化されたデータはバイナリです。何らかの理由でエンコードしない限り、文字列で渡すことはできません。see e.g. this文字列形式で移動する必要がある場合は、base64のようなエンコーディングを使用します。

関連する問題