iOS:DES加密iOS和Android的匹配

来源:互联网 发布:广告公司作图软件 编辑:程序博客网 时间:2024/06/08 17:19

android端的加密代码:

public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding";private static String encode(String key, byte[] data) throws Exception {    try {        DESKeySpec dks = new DESKeySpec(key.getBytes());        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");        Key secretKey = keyFactory.generateSecret(dks);        Cipher cipher = Cipher.getInstance(ALGORITHM_DES);        IvParameterSpec iv = new IvParameterSpec("12345678".getBytes());        AlgorithmParameterSpec paramSpec = iv;        cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec);        byte[] bytes = cipher.doFinal(data);        return Base64.encodeToString(bytes, 0);    } catch (Exception e) {        throw new Exception(e);    }}

首先要关注的是 ALGORITHM_DES = “DES/CBC/PKCS5Padding”这个变量,从中我们可以看出这是DES的CBC加密模式,用的是PKCS5Padding的填充模式。

之后代码使用ALGORITHM_DES来变量初始化Cipher

Cipher cipher = Cipher.getInstance(ALGORITHM_DES);

OC段加密代码

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,                                      kCCOptionPKCS7Padding,                                      [key UTF8String], kCCKeySizeDES,                                      iv,                                      textBytes, dataLength,                                      buffer, 1024,                                      &numBytesEncrypted);

参数说明:

kCCEncrypt:告诉函数执行加密过程,对应的也存在解密过程;
kCCAlgorithmDES:告诉函数执行DES加密;
kCCOptionPKCS7Padding:运用CBC加密模式,并且使用PKCS7Padding的填充模式;
[key UTF8String]:秘钥;
kCCKeySizeDES:秘钥的大小,(kCCKeySizeDES=8) ;
iv:可选的初始矢量 ;
textBytes:要加密的源数据;
dataLength: 数据的大小 ;
buffer:加密后的返回数据;
numBytesEncrypted:返回的数据大小;

JAVA和OC的差异说明:

对于iOS来说,只有PKCS7Padding这一种填充方式,而JAVA有多种。iOS的DES中加密数据包单位长度是8字节,8字节的情况下PKCS7Padding等价与JAVA的PKCS5Padding填充方式。

具体OC代码如下:

//DES加密+ (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key{    NSString *ciphertext = nil;    const char *textBytes = [plainText UTF8String];    NSUInteger dataLength = [plainText length];    unsigned char buffer[1024];    memset(buffer, 0, sizeof(char));    const void *iv = (const void *)[key UTF8String];    size_t numBytesEncrypted = 0;    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,                                          kCCOptionPKCS7Padding,                                          [key UTF8String], kCCKeySizeDES,                                          iv,                                          textBytes, dataLength,                                          buffer, 1024,                                          &numBytesEncrypted);    if (cryptStatus == kCCSuccess) {        NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];        ciphertext = [data base64EncodedStringWithOptions:0];    }    return ciphertext;}//DES解密- (NSString *) decryptUseDES:(NSString*)cipherText key:(NSString*)key{    NSData *cipherData = [[NSData alloc] initWithBase64EncodedString:self options:0];    unsigned char buffer[1024];    memset(buffer, 0, sizeof(char));    size_t numBytesDecrypted = 0;    Byte iv[] = {1,2,3,4,5,6,7,8};    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,                                          kCCAlgorithmDES,                                          kCCOptionPKCS7Padding,                                          [key UTF8String],                                          kCCKeySizeDES,                                          iv,                                          [cipherData bytes],                                          [cipherData length],                                          buffer,                                          1024,                                          &numBytesDecrypted);    NSString* plainText = nil;    if (cryptStatus == kCCSuccess) {        NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];        plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    }    return plainText;}

头文件:

#import <CommonCrypto/CommonCryptor.h>

结尾:

两边需要同步的地方:

1、算法:都是DES;
2、模式:
CBC = kCCOptionPKCS7Padding
EBC = kCCOptionPKCS7Padding|kCCOptionECBMode
3、秘钥:例如:tianwanggaidihu
4、IV变量:
JAVA:
IvParameterSpec iv = new IvParameterSpec(“12347890”.getBytes());
OC:
Byte iv[] = {1,2,3,4,7,8,9,0};
5、编码模式:base64。

参考链接:

DES:
http://blog.csdn.net/u010184533/article/details/38975871
http://blog.csdn.net/dqmj2/article/details/47983351

3DES:
http://blog.csdn.net/lyq8479/article/details/8062867#

原创粉丝点击