RNCryptor IOS + Javascript加密/解密AES 256
问题描述:
我是新来加密,我想通过websockets从一个移动应用程序到一个网页获得一些对称加密使用AES256。RNCryptor IOS + Javascript加密/解密AES 256
我使用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"];
这里是输出出去过的WebSockets 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上使用的迭代)
我已经尝试了一堆不同的东西,这与输出是垃圾im实际上并没有得到解密消息。任何帮助将不胜感激。如果您打算推荐SJCL,请提供一些代码。 RNCryptor使用它自己的消息格式。我使用它,因为它提供了随机iv。如果你知道任何一个,请推荐一个不同的库。
谢谢阅读。
答
请遵守RNCryptor文件格式的文档:https://github.com/RNCryptor/RNCryptor-Spec/blob/master/RNCryptor-Spec-v3.md
您应该能够从文件中获得所有必要的数据,并添加您的共享的秘密......
规范RNCryptor数据格式版本3
Byte: | 0 | 1 | 2-9 | 10-17 | 18-33 | <- ... -> | n-32 - n |
Contents: | version | options | encryptionSalt | HMACSalt | IV | ... ciphertext ... | HMAC |
- 版本(1个字节):数据格式版本。目前3.
- 选项(1个字节): 位0 - 使用密码
- encryptionSalt(8个字节):当且仅当选项包含 “使用密码”
- HMACSalt(8个字节):当且仅当选项包括“使用 密码”
- IV(16个字节)的密文(可变) - 在CBC模式 HMAC加密(32个字节)
所有数据是网络顺序(大端)。
我有类似的问题。你知道如何使用JavaScript中的RNCryptor相同的数据格式吗? – freshking
我也对JavaScript中的加密数据格式非常感兴趣。你也管理过吗? – freshking
因为要求改变,我并没有放弃这条路线。 –