gpt4 book ai didi

ios - AES ECB iOS 加密

转载 作者:可可西里 更新时间:2023-11-01 05:26:53 24 4
gpt4 key购买 nike

我尝试使用带有 ECB 选项的 AES 算法来加密一些字符串。

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
encryptionKey, kCCKeySizeAES128,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

但是 func 返回 kCCAlignmentError (-4303)

然后我尝试对齐数据:

unsigned long diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
unsigned long newSize = 0;

if (diff > 0) {
newSize = dataLength + diff;
}

char dataPtr[newSize];
memcpy(dataPtr, [self bytes], [self length]);
for(int i = 0; i < diff; i++) {
dataPtr[i + dataLength] = 0x20;
}

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
encryptionKey, kCCKeySizeAES128,
NULL /* initialization vector (optional) */,
dataPtr, sizeof(dataPtr), /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);

输入字符串

"test_string,test2"

结果是

jxtFOhYpgBVieM90zx9oDanqBkcsVAvRRJsM4GL3cio=

Android 上的结果是

jxtFOhYpgBVieM90zx9oDUfV7v43WFv7F5bzErfxrL8=

我做错了什么?

最佳答案

简单来说,AES 是一种 block 密码,这意味着它要求输入数据是 block 大小的倍数(AES 为 16 字节)。您的输入数据是 17 个字节,因此存在对齐错误。 (不是内存中的对齐)。

处理这个问题的方法是在选项中指定 PKCS#7 填充:

kCCOptionPKCS7Padding | kCCOptionECBMode

输入数据将被填充到一个 block 倍数,并且在解密时填充将被删除。为了在加密时允许这样做,有必要将输出缓冲区增加一个 block 大小。

考虑不使用 [ECB 模式]( https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29(向下滚动到企鹅),它不安全。

如果您在 Android 上使用 mcrypt:不要,它是废弃软件并且不支持标准填充,仅支持空填充。相反考虑 defuseRNCryptor这是一个完全安全的实现,适用于 iOS 和 Java。

如果您确实使用 mcrypt,则需要添加自己的 PKCS#7 padding .

示例代码如下:

+ (NSData *)doCipher:(NSData *)dataIn
key:(NSData *)symmetricKey
context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
{
CCCryptorStatus ccStatus = kCCSuccess;
size_t cryptBytes = 0; // Number of bytes moved to buffer.
NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

ccStatus = CCCrypt( encryptOrDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
symmetricKey.bytes,
kCCKeySizeAES128,
0,
dataIn.bytes, dataIn.length,
dataOut.mutableBytes, dataOut.length,
&cryptBytes);

if (ccStatus != kCCSuccess) {
NSLog(@"CCCrypt status: %d", ccStatus);
}

dataOut.length = cryptBytes;

return dataOut;
}

示例 PHP PKCS#7 填充:
添加 PKCS#7 填充

$padLength = $blockSize - (strlen($clearText) % $blockSize);
$clearText = $clearText . str_repeat(chr($padLength), $padLength);

剥离 PKCS#7 填充

$padLength = ord($cryptText[strlen($cryptText)-1]);
$cryptText = substr($cryptText, 0, strlen($cryptText) - $padLength);

关于ios - AES ECB iOS 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35921254/

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