【问题标题】:How to use PKCS5padding with AES128 in iphone如何在 iphone 中使用 PKCS5padding 和 AES128
【发布时间】:2013-07-02 09:37:17
【问题描述】:

我已经使用 PKCS7padding 使用 AES128 进行了加密和解密,但它没有使用 Android 和 .NET 进行解密。在 Android 和 .NET 中,Pkcs5padding 用于加密和解密。我的代码是:

- (NSData *)AES128EncryptWithKey:(NSString *)key
{


    char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused)
    bzero( keyPtr, sizeof( keyPtr ) ); // fill with zeroes (for padding)
    [key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
     NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc( bufferSize );

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt,         kCCAlgorithmAES128,kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES128,
                                          NULL ,[self bytes], dataLength, buffer,   bufferSize, &numBytesEncrypted );
    if( cryptStatus == kCCSuccess )
    {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free( buffer ); 
    return nil;

}

- (NSData *)AES128DecryptWithKey:(NSString *)key
{
    char keyPtr[kCCKeySizeAES128+1];   
    bzero( keyPtr, sizeof( keyPtr ) ); 
    [key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];
     NSUInteger dataLength = [self length];


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

    size_t numBytesDecrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt( kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES128,
                                          NULL ,
                                          [self bytes], dataLength, 
                                          buffer, bufferSize, 
                                          &numBytesDecrypted );
    if( cryptStatus == kCCSuccess )
    {
           return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free( buffer ); 
    return nil;


}

如果有人有想法,请提出建议。给我一些建议。

【问题讨论】:

  • "但它不能用 Android 和 .NET 解密" > 你能说得更具体些吗?你把垃圾拿出来吗?第一块是垃圾吗?您是否收到填充错误?
  • 是的,我遇到了填充错误。但感谢上帝,现在我通过实施 kCCOptionECBMode 解决了这个问题。问题解决了。谢谢回复
  • 好。请删除此问题或发布并接受您自己的答案。
  • @DuncanJones 坏主意,答案应该是 PKCS#5 填充和 PKCS#7 填充是相同的,而不是提问者代码中的一些无关问题......
  • 安妮,如果你删除了这个,请发表评论,以便我可以“询问”并回答关于填充的更具体的问题。

标签: android .net ios6 aes


【解决方案1】:

PKCS#5 和 PKCS#7 填充之间只有一个主要区别是块大小。 PKCS#5 填充仅针对 8 字节块大小定义。 PKCS#7 填充适用于从 1 到 255 字节的任何块大小。

这是PKCS#5填充(6.2)的定义:

填充字符串 PS 应由 8 - (||M|| mod 8) 八位字节组成 值为 8 - (||M|| mod 8)。

PKCS#7 是相同的,只是它允许块大小最大为 256 字节(10.3 注 2):

对于这样的算法,方法应该是在 以 k 结尾 - (l mod k) 八位字节都具有值 k - (l mod k),其中 l 是输入的长度。

所以从根本上说,PKCS#5 填充是 8 字节块大小的 PKCS#7 填充的子集。

大多数加密库使用 PKCS#5 或 PKCS#7 来定义相同的填充机制。如果在计算中使用的块大小不是 8,那么正式的 PKCS#7 当然是唯一正确的。

请注意,PKCS#5 和 PKCS#7 都不是填充机制的标准。填充部分只是已定义功能的一小部分(基于密码的加密或 PBE,以及密码消息语法或 CMS)。

【讨论】:

  • 我真诚地希望这个答案足够明确,以便在再次被问到时指出它。
  • 很好的概述,我会尽量记住这个答案,以备将来此类性质的问题。虽然我想知道您是否会更好地创建自己的常见问题解答问题来回答。
  • @DuncanJones 我是asked a question and answered it (as a FAQ question) on crypto。为每个编程环境回答这个问题是没有意义的。无论如何,大多数人都希望使用 Google 寻找答案。如果您知道改进问题或答案的方法,请告诉我。非常感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多