2017-05-07 103 views
0

我试图做的事:web.crypto加密C#解密

  1. 加密使用文本web.crypto,使用AesCryptoServiceProvider 我没有得到我的代码中的任何异常
  2. 解密的文字,但解密不匹配,我已经加密

明文字节decyption后是相同的纯文本,但编码字符串不起作用

我使用随机四,密钥和明文是不变的。

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功能得到paramters:

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

我用错了Ecoding, instand

的转换.ToBase64String(plaintextBytes);

我应该用

Encoding.ASCII.GetString(plaintextBytes);