2017-05-07 6 views
0

ich versuche zu tun:web.crypto Verschlüsselung C# Entschlüsselung

Text
  1. Encrypt Text mit web.crypto,
  2. decrypt mit AesCryptoServiceProvider ich keine Ausnahmen in meinem Code bekommen haben, aber die Entschlüsselung nicht den Klartext übereinstimmen, die i

die Klartextbytes nach decyption verschlüsselt haben, sind die gleichen, aber die Codierung String funktioniert nicht

Ich benutze zufällig iv, der Schlüssel und der Klartext sind konstant.

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); 
} 

Danach schicke ich die Ivec, verschlüsselten Text mit 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");     
    } 

ich die folgenden Nutzenfunktionen mit:

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)); 
    } 

Server-Seite übernimmt die Schlüssel, und nehmen wir an entschlüsseln:

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); 
    } 

Ich habe diese Nutzenfunktion als auch bekam:

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; 
    } 

ich die Paramter aus Anthor Funktion bekommen:

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); 
} 

Antwort

0

ich falsch Ecoding verwendet haben, Instand von

Convert .ToBase64String (KlartextBytes);

Ich sollte

Encoding.ASCII.GetString (plaintextBytes) verwendet haben;

Verwandte Themen