解密返回空字符串

时间:2017-06-26 15:16:55

标签: javascript encryption cryptography

我正在尝试加密来自android的邮件,然后在网络中对其进行解密。

首先,我使用Javascript生成密钥并将其存储在我的数据库中

var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

for( var i=0; i <10; i++ )
    text += possible.charAt(Math.floor(Math.random() * possible.length));
secondaryDatabase.ref().update({
    [displayName]:text
})

其次,我通过检索输入字段中的消息和数据库中的密钥来加密Java中的消息。

message.setText(message);
String key = String.valueOf(dataSnapshot);
encryptedI = AESCrypt.encrypt(key,message);

为了简单起见,让我们把它当作#34; hello world&#34;密钥是密码

String message = "hello world";
String key = "password";
encryptedI = AESCrypt.encrypt(key,message);

第三,我将加密的消息存储在数据库中。

mRef.child(uid).child("encryptedmessage").setValue(encryptedI);

最后,我使用在javascript上使用Cryto-js从数据库检索到的密钥解密了该消息,但它返回一个空字符串

var decrypted = CryptoJS.AES.decrypt(message,key);
var decryptedvalue=decrypted.toString(CryptoJS.enc.Utf8)

我已检查过使用的密钥和加密邮件是否相同,我甚至用Java解密以确保加密正确完成。 我在Android中使用https://github.com/scottyab/AESCrypt-Android进行加密 而在javascript中解密的cryto-js

问题是为什么它会返回一个空字符串,我该如何解决呢。

1 个答案:

答案 0 :(得分:3)

您不能只将两个不同的库放在一起,并希望它们兼容。尽管AES本身已经标准化,但它仅被标准化为具有三种可能密钥大小的分组密码:AES-128,AES-192和AES-256。要实际加密某些东西,您需要一种操作模式和可能的填充。如果您想使用密码而不是密钥,则需要从密码中派生密钥,例如使用PBKDF2。

由于您提到的两个库都很弱且指定不当,我强烈建议您为Java和JavaScript找到两个兼容的基于密码的加密库。

应该可以使用Crypto-JS和Android执行PBKDF2。我不会使用独立的加密库,只需使用Android已有的功能。不要忘记实现高迭代次数,并确保使用的密码达到标准。如果您想要任何类型的安全性,您希望使用经过身份验证的加密,或者使用HMAC-SHA256或类似方法自行实现。

由于我不知道您的用例或威胁模型(我不打算),只是将其视为正确方向的一般提示,而不是可靠的安全建议。