2017-05-07 7 views
0

私がやろうとしている:web.cryptoを使用してweb.crypto暗号化C#の解読

  1. 暗号化テキスト、AesCryptoServiceProvider を使用して
  2. 復号化テキストは、私は私のコードで例外を取得しなかったが、復号化は、私がdecyption後

平文バイトを暗号化された同じきたプレーンテキストと一致していませんが、文字列のエンコードは動作しません

私はランダムivを使用していますが、キーと平文は定数です。その後

function cryptoSys(plaintext,KeyString){ 
     var iVec=window.crypto.getRandomValues(new Uint8Array(16));       
     var encryptSuccessFunc=(encrypt)=> { AfterEncrypt(BytearrayToString(iVec),arraybufferTostring(encrypt));} 
     var ImportKeySuccessFunc= (keyObj)=>{     
            window.crypto.subtle.encrypt(    
            {name:"AES-CBC", iv:iVec}, 
            keyObj, 
            StringToByteArray(plaintext) 
            ).then(encryptSuccessFunc);   

     window.crypto.subtle.importKey(
      "raw", 
      StringToByteArray(KeyString), 
      {name:"AES-CBC", length:128}, 
      true, 
      ["encrypt","decrypt"] 
      ).then(ImportKeySuccessFunc); 
} 

私は、次のユーティリティ機能を使用していJSON

function AfterEncrypt(iVec,ciphertext) 
    {    
     var plaintext="String to Encrypt"; 
     if(iVec==null) 
      return; 
     var send2server= {"ciphertext":ciphertext, 
      "iVec":iVec, 
      "plaintext":plaintext};    
     var objectDataString = JSON.stringify(send2server);    
     sendJSONtoserver(objectDataString,"getDelayedBid");     
    } 

を使用してIVEC、暗号文を送っています:

function StringToByteArray(strString) {    

     var byteArray = new Uint8Array(strString.length); 
     for (var i=0; i<strString.length; i++) { 
      byteArray[i] = strString.charCodeAt(i); 
     } 
     return byteArray; 
    } 
    function BytearrayToString(arrayBuffer) {    
     var strString = "";       
     for (var i=0; i<arrayBuffer.byteLength; i++) {     
      strString += String.fromCharCode(arrayBuffer[i]); 
     } 
     return strString; 
    } 
    function arraybufferTostring(buf) { 
     return String.fromCharCode.apply(null, new Uint8Array(buf)); 
    } 

サーバ側は、キーを受け取り、仮定解読する:

public string DecryptCipher(Encoding u16, string cipherText, string key,string iVec) 
    { 
     byte[] ciphertextBytes = clearZeros(u16.GetBytes(cipherText)); 
     AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 
     aes.BlockSize = 128; 
     aes.KeySize = 128; //minimun key length 
     aes.Key = clearZeros(u16.GetBytes(key)); 
     aes.IV = clearZeros(u16.GetBytes(iVec)); 
     aes.Padding = PaddingMode.PKCS7; 
     aes.Mode = CipherMode.CBC; 
     ICryptoTransform cryptoTrans = aes.CreateDecryptor(aes.Key, aes.IV); 
     byte[] plaintextBytes = cryptoTrans.TransformFinalBlock(ciphertextBytes, 0, ciphertextBytes.Length); 
     cryptoTrans.Dispose(); 
     return Convert.ToBase64String(plaintextBytes); 
    } 

私も、このユーティリティの機能を持っている:

private byte [] clearZeros(byte [] bytearray) 
    { 
     byte[] ans = new byte[bytearray.Length/2]; 
     for (int i = 0; i < bytearray.Length/2; i++) 
      ans[i] = bytearray[2 * i]; 
     return ans; 
    } 

私はanthor関数から偶然にを取得しています:私は間違っEcodingを使用しました

public ActionResult getDelayedBid([FromBody] DelayedSubmission delaySub) 
    { 
     if (delaySub.ciphertext == null) 
      return Json("Failure", JsonRequestBehavior.AllowGet); 
     Encoding u16LE = Encoding.Unicode;   
     String decrypetedMessageLE = new Encryption().DecryptCipher(u16LE, delaySub.ciphertext, getKeyFromDB(), delaySub.iVec);     
     if (decrypetedMessageLE.Equals(delaySub.plaintext)) 
      { 
       return Json("Success", JsonRequestBehavior.AllowGet); 
      } 
     return Json("Failure", JsonRequestBehavior.AllowGet); 
} 

答えて

0

変換の instand .ToBase64String(plaintextBytes);

私は

Encoding.ASCII.GetString(plaintextBytes)を使用していたはずです。