关闭。这个问题需要更多
focused .它目前不接受答案。
Best Answer-推荐答案 strong>
是的。
DES、3DES 和 Blowfish 的 block 大小为 8 字节,因此加密输出将为 8 字节,Base64 编码 8 字节将产生 12 字节。
AES 的 block 大小为 16,因此 8 字节 + 填充将是 16 字节的数据。 Base64 编码 16 字节将产生 24 字节,因此 AES 不起作用。
还有其他问题,例如 CBC 模式和 iv,一个好的方案会使用随机 iv 并将其与加密消息一起传输。可以使用 Base64 中的剩余位来传输部分 iv。但这已经超出了这个问题。
AES 是当前首选的对称加密算法。 DES 不再推荐用于新工作,并且有一些已知的弱 key 。也不推荐河豚,但很多人喜欢它,它可能比 DES 更好。
这是一个使用 8 字节数据和 64 位 key 且没有 iv 的示例。可以通过用 Blowfish 常量替换 3DES 和 24 字节 key 来使用 3DES。这不是推荐的解决方案,一个好的解决方案需要考虑使用情况、所需的安全性、数据值(value)和潜在的攻击者等因素,例如 iv 和 key。
+ (NSData *)doCipherNSData *)dataIn
ivNSData *)iv
keyNSData *)symmetricKey
contextCCOperation)encryptOrDecrypt
errorNSError **)error
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length];
ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmBlowfish,
0,
symmetricKey.bytes,
kCCKeySizeMinBlowfish,
nil,
dataIn.bytes, dataIn.length,
dataOut.mutableBytes, dataOut.length,
&cryptBytes);
if (ccStatus == kCCSuccess) {
dataOut.length = cryptBytes;
}
else {
if (error) {
*error = [NSError errorWithDomain"kEncryptionError"
code:ccStatus
userInfo:nil];
}
dataOut = nil;
}
return dataOut;
}
测试:
我把上面的方法放到了一个类名Test
中。
uint8_t keyBytes[] = {0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18};
NSData *key = [NSData dataWithBytes:keyBytes length:8];
uint8_t dateBytes[] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
NSData *data = [NSData dataWithBytes:dateBytes length:8];
NSLog(@"data: %@", data);
NSError *error;
NSData *encryptData = [Test doCipher:data iv:nil key:key context:kCCEncrypt error:&error];
NSString *encryptString = [encryptData base64EncodedStringWithOptions:0];
NSLog(@"encryptData: %@", encryptData);
NSLog(@"encryptString: %@", encryptString);
NSData *decryptData = [Test doCipher:encryptData iv:nil key:key context:kCCDecrypt error:&error];
NSLog(@"decryptData: %@", decryptData);
输出:
数据:01020304 05060708
加密数据:9e8ec0a8 71ab9d10
加密字符串:no7AqHGrnRA=
解密数据 01020304 05060708
关于ios - 加密 8 字节字符串/base64 编码/最大长度 20 字节,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/28289365/
欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://sqlite.in/) |
Powered by Discuz! X3.4 |