kccoptionpkcs7padding php,iOS中数据加密方式(DES/CBC/PKCS5Padding)

项目关于金融方面的,需要对数据进行加密措施。后台用的是DES/CBC/PKCS5Padding,也就是DES加密,CBC模式,PKCS5Padding方式填充,在这里记录下iOS下对接的。

DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密。

加密代码如下,注释的是ECB模式的,在这里以CBC模式说明:

+(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key{

// NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

// unsigned char buffer[1024];

// memset(buffer, 0, sizeof(char));

// size_t numBytesEncrypted = 0;

//

// CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,

// kCCAlgorithmDES,

// kCCOptionPKCS7Padding| kCCOptionECBMode,

// [key UTF8String],

// kCCKeySizeDES,

// nil,

// [data bytes],

// [data length],

// buffer,

// 1024,

// &numBytesEncrypted);

//

// NSString* plainText = nil;

// if (cryptStatus == kCCSuccess) {

// NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];

// plainText = [GTMBase64 stringByEncodingData:dataTemp];

plainText = [[NSString alloc] initWithData:[GTMBase64 encodeData:dataTemp] encoding:NSUTF8StringEncoding];

// }else{

// NSLog(@"DES加密失败");

// }

// return plainText;

//CBC方式

NSString *ciphertext = nil;

NSData *textData = [clearText dataUsingEncoding:NSUTF8StringEncoding];

NSUInteger dataLength = [textData length];

unsigned char buffer[1024 * 4];

memset(buffer, 0, sizeof(char));

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String], kCCKeySizeDES,

iv,

[textData bytes], dataLength,

buffer, 1024 * 4,

&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {

NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];

ciphertext = [GTMBase64 stringByEncodingData:data];

}

return ciphertext;

}

DES加密的主要过程是:用CCCrypt函数加密一下,然后用base64编码下,再传过去。

这里我们首先关注的是前面三个参数,第一个‘kCCEncrypt’ 是告诉函数执行加密过程,对应的也存在解密过程,具体的可以command+左键来查看详情;第二个kCCAlgorithmDES 便是告诉函数执行DES加密;第三个参数是 kCCOptionPKCS7Padding ,其实单单这个参数就是告诉了函数 运用CBC加密模式,并且使用PKCS7Padding的填充模式进行加密,iOS和安卓的填充是不一样的,对第三个参数进行commend+左键查看,可以发现里面只有两个枚举变量,kCCOptionPKCS7Padding和kCCOptionECBMode。如果我们第三个变量写成kCCOptionPKCS7Padding|kCCOptionECBMode,就表示运用了ECB加密模式,并且使用PKCS7Padding的填充模式进行加密。所以单单使用kCCOptionPKCS7Padding就代表了CBC加密模式。

GTMBase64是Base64对数据进行加密,这个文件我从网上下的。可以从我的github上点击下载

关于参数IV,它是CBC模式的初始向量,至关重要,ECB模式下置为nil。在这里IV参数我根据网上的,我直接

const Byte iv[] = {1,2,3,4,5,6,7,8};

不过不是绝对的,如果你不行的话,你可以试试

const void *iv = (const void *)[key UTF8String];

DES解密代码如下,注释为ECB模式下,解释和上面加密一样

+(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key {

//ECB格式

// // 利用 GTMBase64 解碼 Base64 字串

// NSData* cipherData = [GTMBase64 decodeString:cipherText];

// unsigned char buffer[1024];

// memset(buffer, 0, sizeof(char));

// size_t numBytesDecrypted = 0;

//

// // IV 偏移量不需使用

// CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

// kCCAlgorithmDES,

// kCCOptionPKCS7Padding| kCCOptionECBMode,

// [key UTF8String],

// kCCKeySizeDES,

// nil,

// [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] autorelease];

// }

// return plainText;

//CBC方式

NSString *plaintext = nil;

NSData *cipherdata = [GTMBase64 decodeString:cipherText];

unsigned char buffer[1024];

memset(buffer, 0, sizeof(char));

size_t numBytesDecrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,

kCCOptionPKCS7Padding,

[key UTF8String], kCCKeySizeDES,

iv,

[cipherdata bytes], [cipherdata length],

buffer, 1024,

&numBytesDecrypted);

if(cryptStatus == kCCSuccess) {

NSData *plaindata = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted];

plaintext = [[NSString alloc]initWithData:plaindata encoding:NSUTF8StringEncoding];

}

return plaintext;

}

最后附上SHA1加密,我们项目中对参数做了签名就是通过这种方式。

记得导入

#include

#import

+(NSString *) sha1:(NSString *)input {

const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];

NSData *data = [NSData dataWithBytes:cstr length:input.length];

uint8_t digest[CC_SHA1_DIGEST_LENGTH];

CC_SHA1(data.bytes, (unsigned int)data.length, digest);

NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

for(int i=0; i

[output appendFormat:@"%02x", digest[i]];

}

return output;

}

好记性不如烂笔头~~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值