IOS和Java进行AES密文传输(ECB&nb…

来源:互联网 发布:软件被劫持 编辑:程序博客网 时间:2024/06/05 20:19
     可以参考之前写的:Java和C/C++进行DES/AES密文传输。现在老革命遇到新问题,需要开发IOS应用。之前了解了一定的加密知识,整个过程还是比较顺利的。
    使用CommonCryptor.h的方法进行加解密。几个关键参数设置如下:
    加密算法:kCCAlgorithmAES128 (kCCAlgorithmAES也一样);
     iv:设置为nil就可以了。因为ECB方式不需要初始化向量。如果不是采用ECB,那么除了密钥之外,加解密放的初始化向量也必须一致。
    options: (kCCOptionPKCS7Padding |kCCOptionECBMode)。后一个option比较明显,因为其他端也是采用ECB。第一个option就比较曲折。一开头到处找PKCS5Padding,发现体位都很复杂,差点想引入openssl。不过后面搜索到PKCS7Padding和PKCS5Padding是兼容的(黑线IOS和Java进行AES密文传输(ECB <wbr>+ <wbr>PKCS5Padding)),经测试还真的是兼容的。于是blabla搞定。
   网上找到一个开源的(NSData+CommonCrypto),撸来用了,写起来比较方便,加密代码:
-(NSData*) encryptText:(NSString*)text {
    CCCryptorStatus status =kCCSuccess;
    NSData* result = [[textdataUsingEncoding:NSUTF8StringEncoding]
                     dataEncryptedUsingAlgorithm:kCCAlgorithmAES128
                     key:[self getAesKey]
                     initializationVector:nil   //ECB加密不会用到iv
                     options:(kCCOptionPKCS7Padding|kCCOptionECBMode)
                     error:&status];
    if (status !=kCCSuccess) {
       DLog(@"加密失败:%d", status);
       return nil;
    }
    return result;
}  
    解密代码如下:
-(NSString*) decryptText:(NSData*)data {
    CCCryptorStatus status =kCCSuccess;
    NSData* result =[data
                  decryptedDataUsingAlgorithm:kCCAlgorithmAES128
                   key:[[self getAesKey]
                   initializationVector:nil  // ECB解密不会用到iv
                  options:(kCCOptionPKCS7Padding|kCCOptionECBMode)
                   error:&status];
    if (status !=kCCSuccess) {
       DLog(@"加密失败:%d", status);
       return nil;
    }
    return [[NSString alloc]initWithData:result encoding:NSUTF8StringEncoding];
}
     经测试,可以与Java服务端(ECB + PKCS5Padding)进行文本的加解密操作。
0 0