gpt4 book ai didi

ios - 使用来自 CryptoJS 的 base64 key 在 iOS 上进行 AES 加密

转载 作者:行者123 更新时间:2023-11-29 00:12:52 25 4
gpt4 key购买 nike

我正在使用 CryptoJS 生成和导出 key :

const password = crypto.lib.WordArray.random(128 / 8);
const salt = crypto.lib.WordArray.random(128 / 8);
const encryptionKey = crypto.PBKDF2(password, salt, {keySize: 128 / 32});
return encryptionKey.toString();

现在我正在尝试使用 iOS 上的 key 加密一些数据:

const char *s = [encryptionKey cStringUsingEncoding:NSASCIIStringEncoding];
NSData *keyData= [NSData dataWithBytes:s length:strlen(s)];

NSMutableData *ivData = [NSMutableData dataWithLength:kCCBlockSizeAES128];
SecRandomCopyBytes(kSecRandomDefault, kCCBlockSizeAES128, ivData.mutableBytes);
NSData *iv = [NSData dataWithData:ivData];

size_t outLength;

NSMutableData *cipherData = [NSMutableData dataWithLength:dataString.length + kCCBlockSizeAES128];
CCCrypt(kCCEncrypt, // operation
kCCAlgorithmAES128, // Algorithm
kCCOptionPKCS7Padding, // options
keyData.bytes, // key
keyData.length, // keylength
iv.bytes,// iv
jsonData.bytes, // dataIn
jsonData.length, // dataInLength,
cipherData.mutableBytes, // dataOut
cipherData.length, // dataOutAvailable
&outLength); // dataOutMoved

cipherData.length = outLength;

NSString *cipherText = [cipherData base64EncodedStringWithOptions:NSUTF8StringEncoding];
NSString *ivText = [iv base64EncodedStringWithOptions:NSUTF8StringEncoding];

return [ivText stringByAppendingString:cipherText]

到目前为止一切正常。尝试使用 CryptoJS 解密数据失败了:

const iv = crypto.enc.Base64.parse(message.substr(0, 24));
const encrypted = crypto.enc.Base64.parse(message.substring(24));

const decrypted = crypto.AES.decrypt(encrypted, encryptionKey, {
iv: iv,
padding: crypto.pad.Pkcs7,
mode: crypto.mode.CBC
});
console.log(decrypted.toString(crypto.enc.Utf8))

问题似乎出在将 key 从 CryptoJS 传递到 iOS 时。传递给 CCCrypt 的正确格式是什么?

最佳答案

base64EncodedStringWithOptions 的选项不正确,将会向 Base64 编码的 iv 和加密数据添加行结束字符。

您不需要行结尾选项,默认情况下,不会插入行结尾。只需指定 0:

NSString *cipherText = [cipherData base64EncodedStringWithOptions:0];
NSString *ivText = [iv base64EncodedStringWithOptions:0];

选项 请注意,NSUTF8StringEncoding 不是方法 base64EncodedStringWithOptions 的编码选项。选项是:

NSDataBase64Encoding64CharacterLineLength
NSDataBase64Encoding76CharacterLineLength
NSDataBase64EncodingEndLineWithCarriageReturn
NSDataBase64EncodingEndLineWithLineFeed`

都是行分隔符选项。

关于ios - 使用来自 CryptoJS 的 base64 key 在 iOS 上进行 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45928187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com