【问题标题】:3DES encryption different on iPhone and serveriPhone和服务器上的3DES加密不同
【发布时间】:2011-08-25 16:47:59
【问题描述】:

我有以下代码用于加密我发送到我的服务器的请求。服务器上的解码是由 .NET 完成的,在 iPhone 上,我使用的是带有以下代码的安全框架。

- (NSString*) doCipher:(NSString*)plainText:(CCOperation)encryptOrDecrypt {

const void *vplainText;
size_t plainTextBufferSize;

if (encryptOrDecrypt == kCCDecrypt)
{
    NSData *EncryptData = [[NSData alloc] initWithBase64EncodedString:plainText];
    plainTextBufferSize = [EncryptData length];
    vplainText = [EncryptData bytes];
}
else
{
    plainTextBufferSize = [plainText length];
    vplainText = (const void *) [plainText UTF8String];
}

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

uint8_t iv[kCCBlockSize3DES];
memset((void *) iv, 0x0, (size_t) sizeof(iv));

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

NSString *key = @"D3v3lop_4pp13_f0r_M4z4Y4";
const void *vkey = (const void *) [key UTF8String];

ccStatus = CCCrypt(encryptOrDecrypt,
                   kCCAlgorithm3DES,
                   kCCOptionPKCS7Padding,
                   vkey, //"123456789012345678901234", //key
                   kCCKeySize3DES,
                   iv, //"init Vec", //iv,
                   vplainText, //"Your Name", //plainText,
                   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] autorelease];
}
else
{
    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    result = [myData base64Encoding];   
}    
return result;
}    

当加密字符串少于 8 个字符时,服务器和 iPhone 上的加密结果相同!之后,它给出了不同的结果。 我是这方面的初学者,有没有关于在哪里看的提示?

【问题讨论】:

  • 您能找出问题的原因吗?

标签: iphone ios encryption 3des


【解决方案1】:

是的,您的密码模式和/或填充不同。确保在服务器和客户端上使用相同的模式。例如,在大多数情况下,带有 PKCS#7 填充的 CBC 模式是一个不错的选择。

您使用 3DES 有什么特别的原因吗?它比 AES 慢得多(性能稍差)。

【讨论】:

  • 感谢您的快速回答。我正在为已经构建的服务器 API 调整应用程序。我在stackoverflow上的某个地方读到PKCS5和PKCS7是相同的。服务器正在使用 PKCS5。会是这个原因吗?
  • PKCS5 和 PKCS7 实际上是相同的,只是 PKCS5 只为最多 64 位块定义,而 PKCS7 最多为 128 位块定义。否则它们是相同的。
  • @Adhamox:也许尝试 CTR 或(颤抖)ECB 模式来互操作?
  • 您在欧洲央行模式下不寒而栗是对的,尽可能避免它。 CBC 或 CTR 更优越,更安全。
猜你喜欢
  • 1970-01-01
  • 2014-10-18
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
  • 2010-11-26
  • 2021-08-19
相关资源
最近更新 更多