gpt4 book ai didi

ios - 在 iOS 中使用 CFB8 和无填充的 3DES 加密?

转载 作者:行者123 更新时间:2023-11-28 22:17:10 26 4
gpt4 key购买 nike

我正在开发一个将加密数据发送到服务器的应用程序。服务器使用 3des 和 CFB8,没有填充。我已经阅读了 stackoverflow 中的大部分相关问题,但仍然无法正常工作。已经为此工作了几天,但仍然无法使其与服务器加密相匹配。这是我试过的-

 + (NSString*) doCipher:(NSString*)plainText operation:(CCOperation)encryptOrDecrypt {

const void *vplainText;
NSData* plainTextData;
size_t plainTextBufferSize;

if (encryptOrDecrypt == kCCDecrypt)
{
NSData *EncryptData =[NSData dataWithBase64EncodedString:plainText];
plainTextBufferSize = [EncryptData length];
vplainText = [EncryptData bytes];
}
else
{
plainTextData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
plainTextBufferSize = [plainTextData length];
}

CCCryptorStatus ccStatus;
uint8_t *bufferPtr = NULL;
size_t bufferPtrSize = 0;
size_t movedBytes = 0;
uint8_t iv[kCCBlockSize3DES];

bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
memset((void *)bufferPtr, 0x0, bufferPtrSize);
memset((void *) iv, 0x0, (size_t) sizeof(iv));

const void *vkey = kPrivateKey;
unsigned char IV[8]={0,0,0,0,0,0,0,0};

ccStatus = CCCrypt(encryptOrDecrypt,
kCCAlgorithm3DES,
0,
[keyData bytes],
[key length],
IV,
[plainTextData bytes],
plainTextBufferSize,
(void *)bufferPtr,
bufferPtrSize,
&movedBytes);

if (ccStatus == kCCSuccess) NSLog(@"SUCCESS");
else if (ccStatus == kCCParamError) return @"PARAM ERROR";
else if (ccStatus == kCCBufferTooSmall) return @"BUFFER TOO SMALL";
else if (ccStatus == kCCMemoryFailure) return @"MEMORY FAILURE";
else if (ccStatus == kCCAlignmentError) return @"ALIGNMENT";
else if (ccStatus == kCCDecodeError) return @"DECODE ERROR";
else if (ccStatus == kCCUnimplemented) return @"UNIMPLEMENTED";

NSString *result;

if (encryptOrDecrypt == kCCDecrypt)
{
result = [[NSString alloc] initWithData: [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes] encoding:NSASCIIStringEncoding];
}
else
{
NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
result = [myData base64EncodedString];
}

return result;
}

似乎 CCOptions 目前支持 kCCOptionPKCS7PaddingkCCOptionECBMode。如何使用 CFB8 实现 3des 且无填充。任何建议将不胜感激。

最佳答案

编辑:抱歉;之前我忽略了一个关键点。你永远不会要求 CFB8 模式。默认为 CBC 模式。

你不能为此使用 CCCrypt()。您必须使用 CCCryptorCreateWithMode() 才能通过该模式。然后用数据调用 CCCryptorUpdate() 并调用 CCCryptorFinal() 完成。


如果您不需要填充,为什么要请求填充?删除 kCCOptionPKCS7Padding。如果您不需要任何选项(您似乎不需要),只需传递 0。

CFB-8 采用初始化向量。您已将其设置为全 0。这是服务器正在使用的吗? (这是一个非常差的 IV;CFB 的 IV 应该是随机的,而不是固定的。)

这些行很危险:

    plainTextBufferSize = [plainText length];
vplainText = (const void *) [plainText UTF8String];

这将截断任何多字节字符串。更好的解决方案是创建一个 NSData:

plainTextData = [self.plainText dataUsingEncoding:NSUTF8StringEncoding];

然后您可以在 plainTextData 上使用 byteslength

关于ios - 在 iOS 中使用 CFB8 和无填充的 3DES 加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378979/

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