2014-04-04 53 views
1

我想解密使用des在ecb模式下首先加密的字符串,然后使用base64编码。ios使用des ecb解密base64编码字符串

这是我的代码:

+ (NSString *)decrypt:(NSString *)encryptedText 
{ 
    NSString *key = @"12345678"; 
    NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:encryptedText options:0]; 
    size_t numBytesDecrypted = 0; 
    size_t bufferSize = [decodedData length] + kCCBlockSizeDES; 
    void *buffer = malloc(bufferSize); 
    char keyPtr[kCCKeySizeDES+1]; // room for terminator (unused) 
    bzero(keyPtr, sizeof(keyPtr)); 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 


    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, 
             kCCAlgorithmDES, 
             kCCOptionPKCS7Padding | kCCOptionECBMode, 
             keyPtr, 
             kCCKeySizeAES256, 
             NULL /* initialization vector (optional) */, 
             [decodedData bytes], [decodedData length], /* input */ 
             buffer,  bufferSize, /* output */ 
             &numBytesDecrypted); 

    NSData *val = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    return [[NSString alloc] initWithData:val encoding:NSUTF8StringEncoding]; 
} 

但是我的回报得到一个零字符串...任何想法?

+0

有趣的是,这是与今天早些时候的另一个问题相同的基本代码的复制/粘贴。这看起来像一个类项目。 – zaph

+0

我可以向你保证这不是一个课程项目。但是我在别处找到了这个代码。 –

+0

好吧,只是有趣的是,同一天的基本代码被选中。我可以看到基本代码更简单,这是一个合理的选择理由。不幸的是,代码已经足够老,不再是最佳实践,Rob Napier [RNCryptor](https://github.com/RNCryptor/RNCryptor)是一个更好的选择。 – zaph

回答

1

您正在使用DES,但指定的密钥大小为:kCCKeySizeAES256致电CCCrypt

从安全的角度来看,这段代码有太多的错误,不要在真实的应用程序中使用它。这不再是最佳做法。除此之外,密码应该使用基于密码的密钥派生函数(例如PBKDF2)转换为密钥。还使用DES和ECB模式是一个弱点。

+0

加密方面是作为一个减轻因素。我将数据编码到qr代码中,为了防止它被轻易读取,我正在对数据进行加密。即使使用解密的数据,安全性也不会受到太大的影响......除非我花费更多的时间让安全性变得更低,否则我不认为这是值得的。 –

+1

考虑使用AES,它同样易于使用并提供更好的安全性。 – zaph

+0

请问,谢谢! –