Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在iphone中与AES128一起使用PKCS5P_Android_.net_Ios6_Aes - Fatal编程技术网

Android 如何在iphone中与AES128一起使用PKCS5P

Android 如何在iphone中与AES128一起使用PKCS5P,android,.net,ios6,aes,Android,.net,Ios6,Aes,我用AES128和PKCS7padding进行了加密和解密,但没有用Android和.NET进行解密。在Android和.NET中,Pkcs5padding用于加密和解密。我的代码是: - (NSData *)AES128EncryptWithKey:(NSString *)key { char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused) bzero( keyPtr, sizeof( keyPtr

我用AES128和PKCS7padding进行了加密和解密,但没有用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;


}

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

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

这是填充的定义(6.2):

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

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

对于此类算法,方法应为在 尾端有k-(l模k)个八位组,所有八位组都有k值- (l mod k),其中l是输入的长度

因此从根本上讲,PKCS#5填充是PKCS#7填充的子集,用于8字节块大小

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


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

“但它不是用Android和.NET解密”>您能更具体一点吗?你把垃圾倒出去吗?第一个街区是垃圾吗?你有填充错误吗?是的,我有填充错误。但是感谢上帝,现在我已经通过实现kCCOptionECBMode解决了这个问题。问题解决了。谢谢你的回复。请删除此问题或发布并接受您自己的答案。@DuncanJones坏主意,答案应该是PKCS#5填充和PKCS#7填充是相同的,而不是询问者代码中的一些无关问题……安妮,如果您删除此内容,请发表评论,以便我可以“询问”然后回答一个关于填充物的更具体的问题。我真诚地希望这个答案足够明确,当再次被问到时可以指出它。很好的概述,我将尝试记住这个答案,以便将来回答类似的问题。虽然我不知道你是否会更好地创建自己的FAQ问题来回答。@DuncanJones我已经。对于每个编程环境回答这个问题是没有意义的。不管怎样,大多数人都希望通过谷歌找到答案。如果你知道如何改进问题或答案,请告诉我。非常感谢您的意见。