我试图加密来自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);为了简单起见,让我们把消息理解为"hello world“,关键是密码。
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进行解密。
问题是为什么它会返回一个空字符串,以及我如何解决它。
发布于 2017-06-26 15:51:42
你不能只是把两个不同的库放在一起,希望它们是兼容的。虽然AES本身已经标准化,但它仅被标准化为具有三个可能的密钥大小的分组密码: AES-128、AES-192和AES-256。要真正加密某物,您需要一种操作模式,并可能需要填充。如果要使用密码而不是密钥,则需要从密码派生密钥,例如使用PBKDF2。
由于您提到的两个库都很弱,而且指定得很糟糕,我强烈建议您为Java和JavaScript找到两个兼容的基于密码的加密库。
应该可以同时使用Crypto和Android执行PBKDF2。不过,我不会使用独立的密码库,只要使用已经通过Android提供的功能即可。不要忘记实现较高的迭代计数,并确保所使用的密码达到标准。如果您想要任何类型的安全性,您希望使用认证加密或自己实现使用HMAC- that 256或类似的。
由于我不知道您的用例或威胁模型(我也不打算这样做),所以将其视为正确方向的一般提示,而不是可靠的安全建议。
https://stackoverflow.com/questions/44762969
复制相似问题