我是加密新手,我正在尝试通过 websockets 将一些对称加密使用 AES256 从移动应用程序传输到网页。
I 使用 RNCryptor 默认设置加密数据
IOS代码
NSString* message = @"testmessage";
NSData* pubData = [message dataUsingEncoding:NSUTF8StringEncoding];
NSData *encryptedData = [RNEncryptor encryptData:pubData
withSettings:kRNCryptorAES256Settings
password:@"test"
error:&error];
if(error) {
NSLog(@"Error encrypting %@", [error localizedDescription]);
}
NSString* encryptedString = [encryptedData base64Encoding];
NSLog(@"Sending message %@", encryptedString);
[self.session publishData:[encryptedString dataUsingEncoding:NSUTF8StringEncoding] onTopic:@"test12345"];
这是通过 websocket 输出的输出 AgEBnXPPvAkJb7YVapwCVNd5SQw4JwqU7BfLsEXNZyKy9SazfJT8w16Y/hYY7aKxuz3Kuy2tAXXX/cHCc3PMhvG+fzSfrslRVMKvD6L+oWvXLg==
JAVASCRIPT 代码 - 我收到消息并尝试解析并显示它
function onMessageArrived(message) {
var rawData = base64.decode(message.payloadString);
var encryptionSalt = rawData.substr(2,8);
var hmacSalt = rawData.substr(10,8);
var iv = rawData.substr(18, 16);
var ciphertext = rawData.substr(34, rawData.length-34-32);
var hmac = rawData.substr(rawData.length-32, 32);
var password = "test";
var key = CryptoJS.PBKDF2(password, encryptionSalt, { keySize: 256 / 32, iterations: 10000});
var plaintextArray = CryptoJS.AES.decrypt(
{ ciphertext: CryptoJS.enc.Utf8.parse(ciphertext) },
CryptoJS.enc.Hex.parse(key),
{ iv: CryptoJS.enc.Latin1.parse(iv) }
);
showScreen('<span style="color: blue;">User: ' + CryptoJS.enc.Latin1.stringify(plaintextArray) + '</span>');
};
由于某种原因,代码在生成密钥时卡住了(可能 10k 次迭代对于 CryptoJS 来说太多了???这就是 IOS 上使用的迭代)
我已经尝试了很多不同的东西,输出是垃圾,我实际上并没有解密消息。任何帮助将不胜感激。如果您要推荐 SJCL,请提供一些代码。RNCryptor 使用自己的消息格式。我使用它是因为它提供了随机静脉注射。如果您也知道任何图书馆,请推荐一个不同的图书馆。
谢谢阅读。