2012-12-30 65 views
2

我使用EncryptStringToBytes_Aes方法从MSDN加密使用自定义密码这样一些数据:如何使用JavaScript解密AesCryptoServiceProvider?

string original = "some data to encrypt"; 
byte[] encrypted; 

using (AesManaged aes = new AesManaged()) 
{ 
    // Prepare new Key and IV. 
    string passphrase = "somepassphrase"; 
    byte[] saltArray = Encoding.ASCII.GetBytes("somesalt"); 
    Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(passphrase, saltArray); 
    aes.Key = rfcKey.GetBytes(aes.KeySize/8); 
    aes.IV = rfcKey.GetBytes(aes.BlockSize/8); 

    // Encrypt the string to an array of bytes. 
    encrypted = EncryptStringToBytes_Aes(original, aes.Key, aes.IV); 

    // Decrypt the bytes to a string. 
    string roundtrip = DecryptStringFromBytes_Aes(encrypted, aes.Key, aes.IV); 

    return Convert.ToBase64String(encrypted); 
} 

和它的作品(DecryptStringFromBytes_Aes返回原始字符串)。

我的问题是我如何使用JavaScript解密encrypted,如果我在客户端也有相同的密码短语?我尝试使用CryptoJS来解密它,但没有成功。数据在web服务中得到加密,我尝试将它作为字节数组,字符串传递给JS,尝试使用各种编码进行编码,但无论我做了什么,我都无法获取原始字符串。我在这里做错了什么,我该如何做这项工作?它甚至可以这样做吗? saltArray编码甚至自定义密码的使用是否可以解决我的问题?

这里是例如我的JS尝试(使用base64编码)之一:

var decoded = CryptoJS.enc.Base64.parse(encrypted); 
var decrypted = CryptoJS.AES.decrypt(decoded, "somepassphrase"); 

(编辑:我的意思是以后实施随机盐,一旦我得到了一切工作呢,因为它更容易追踪这是怎么回事)

+2

你滥用CBC总是使用相同的IV。 IV应该是一个随机字节序列,不应该被重复使用。 – SLaks

+0

@SLaks - 使用随机盐会每次给我不同的IV,这就是你正在尝试的,对吧?我的意思是稍后实施随机盐,一旦一切正常。 – pootzko

+1

正确。您将需要随每条消息一起传送IV。 (IV不需要保密) – SLaks

回答

相关问题