gpt4 book ai didi

ios - 在 iOS 中解密加密文件 (AES CFB8)

转载 作者:行者123 更新时间:2023-11-28 21:53:11 25 4
gpt4 key购买 nike

我需要解密用 openssl 加密的文件,如下所示:

 openssl enc -d -aes-256-cfb8  -nopad  -in myFile -iv myIV -K myKey

特别是 iv 和 key 是字节数组。示例(十六进制):

key: 5492557823faec274708eb34d263029084abe5544789340a1d3ccf6bd74774ad
iv: 01e2a0ac72375edec4b126b1197a2885

我该怎么做?

我试着按照这里的例子AES/CFB8 IV size但收效甚微。

编辑:

这是我已经尝试过的:

NSString *IVString = @"3d090e3f7a72d51ae4f4d0d15025926e";
NSString *KEYString = @"207ecf137586424952b8cfc3e7fd8ce9bd839a916c07b9d5f34d250315d91aa9";


NSData *myIV = [IVString decodeFromHexidecimal];
NSData *myKey = [KEYString decodeFromHexidecimal];

CCCryptorStatus result = CCCryptorCreateWithMode(kCCDecrypt,
kCCModeCFB8,
kCCAlgorithmAES128,
ccNoPadding,
[myIV bytes],
[myKey bytes],
kCCKeySizeAES256,
NULL,
0,
0,
0,
&_cryptor);

size_t *outLength;

NSMutableData *cipherData = [NSMutableData dataWithLength:self.length + kCCBlockSizeAES128];

if (result == kCCSuccess)
result = CCCryptorUpdate(_cryptor,
[self bytes],
[self length],
[cipherData mutableBytes],
[cipherData length],
outLength);

if (result == kCCSuccess)
result = CCCryptorFinal(_cryptor,
[cipherData mutableBytes],
[cipherData length],
outLength);
if (result == kCCSuccess)
result = CCCryptorRelease(_cryptor);

编辑 2:

谢谢 Rob,它帮了我大忙!

最终代码:

CCCryptorStatus result = CCCryptorCreateWithMode(kCCDecrypt,
kCCModeCFB8,
kCCAlgorithmAES128,
ccNoPadding,
[myIV bytes],
[myKey bytes],
kCCKeySizeAES256,
NULL,
0,
0,
0,
&cryptor);


size_t bufferLength = CCCryptorGetOutputLength(cryptor, [self length], false);
NSMutableData *buffer = [NSMutableData dataWithLength:bufferLength];

size_t outLength;


result = CCCryptorUpdate(cryptor,
[self bytes],
[self length],
[buffer mutableBytes],
[buffer length],
&outLength);


result = CCCryptorRelease(cryptor);

最佳答案

您将 cipherData 作为缓冲区传递,但您没有在其中创建任何空间。 (您还在更新和最终步骤中使用相同的缓冲区而不卸载结果,因此这可能会破坏您的结果,尽管在这种情况下您可能会逃脱它,因为没有填充)。 (编辑:我几个小时前开始写这篇文章;我看到你从那时起就更改了代码以分配缓冲区,但你仍在重复使用它,这会破坏你的结果。我还看到你从加密解密。请注意,您的结果不再是“cipherData”。)

首先创建你的 cryptor(这部分是正确的,虽然没有理由把它放在一个 ivar 中):

CCCryptorRef cryptor;
CCCryptorStatus result = CCCryptorCreateWithMode(kCCEncrypt,
...
&cryptor);

// FIXME: Return error
if (result != kCCSuccess) { NSAssert(@"Failed to create cryptor: %d", result) }

然后算出你的缓冲区有多大:

size_t bufferLength = CCCryptorGetOutputLength(cryptor, [self length], true);

现在创建一个缓冲区:

NSMutableData *buffer = [NSMutableData dataWithLength:bufferLength];

设置输出变量:

size_t outLength;
NSMutable *cipherData = [NSMutableData data];

处理数据:

result = CCCryptorUpdate(cryptor,
[self bytes],
[self length],
[buffer mutableBytes],
[buffer length],
&outLength);

// FIXME: Release cryptor and return error
if (result != kCCSuccess) { NSAssert(@"Failed to encrypt: %d", result) }

将我们到目前为止的内容复制到我们的最终结果中(见注释):

[cipherData appendBytes:buffer.bytes length:outLength];

完成(因为没有填充,这可能不会做任何事情,但在一般情况下这是必要的):

result = CCCryptorFinal(cryptor,
[buffer mutableBytes],
[buffer length],
&outLength);

// FIXME: Release cryptor and return error
if (result != kCCSuccess) { NSAssert(@"Failed to finalize: %d", result) }

如果我们有任何东西附加它,并做最后的清理

[cipherData appendBytes:buffer.bytes length:outLength];

result = CCCryptorRelease(cryptor);
if (result != kCCSuccess) { NSLog(@"Failed to do final cleanup, ignoring: %d", result) }

应该就是这样。

请注意,您可以通过在更新和最终之间向前移动缓冲区指针来重做此操作,这样您就不必复制密文,但除非它有很多密文,否则我会这样做简单的方法并制作副本。

关于ios - 在 iOS 中解密加密文件 (AES CFB8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27529846/

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