+(NSString *)encrypt:(NSString *)url{
NSString *plaintext = url; // ordinary plaintext
NSString *enResult1 =[GMSm2Utils encryptText:plaintext publicKey:SM2PubKey];
//openssl 加密出来的结果是带编码的,与java平台不兼容 需要先解码
NSString *c1c3c2Result1 = [GMSm2Utils asn1DecodeToC1C3C2:enResult1];
return [NSString stringWithFormat:@"04%@",c1c3c2Result1];
}
因为ios端使用的是openssl ,加密出的结果是带ASN1编码的,所以需要一层解码供java平台使用
经测试需要在最终的结果前面加上04, 具体原因还未知
SM2解密 SM2Prikey替换为私钥+(NSString *)ecbDecryptM2:(NSString *)url{
// 明文
NSString *asn1Result2 = [GMSm2Utils asn1EncodeWithC1C3C2:url];
NSString *deResult1 = [GMSm2Utils decryptToText:asn1Result2 privateKey:SM2Prikey]; // 解密为普通字符串明文
return deResult1;
}
同理, 解密时需要先进行ASN1编码再进行解密
SM4加密 SM4的钥匙只有一个,且为32字节的HexString,如果服务端提供的不是,自己转一下HexString+(NSString *)UserDefaultSm4Encrypt:(NSString *)str{
NSString *sm4Key = [APPUtils hexStringFromString:UserDefaultSm4Key]; // 32字节十六进制编码格式字符串密钥//
NSString *ecbCipertext = [GMSm4Utils ecbEncryptText:str key:sm4Key]; // 加密普通字符串明文
return [APPUtils jugeString:ecbCipertext];
}
SM4解密
同理, 钥匙与加密一致不分公钥私钥
+(NSString *)UserDefaultSm4Decrypt:(NSString *)str{
NSString *sm4Key = [APPUtils hexStringFromString:UserDefaultSm4Key]; // 32字节十六进制编码格式字符串密钥//
// 明文
NSString *ecbPlaintext = [GMSm4Utils ecbDecryptText:str key:sm4Key];
return [APPUtils jugeString:ecbPlaintext];
}
以上, [APPUtils jugeString:ecbCipertext] 为空判断,如果为nil 转为空字符串防止崩溃
附上转hexstring代码 字符串转hexString
- (NSString *)hexStringFromString:(NSString *)string{
NSData *myD = [string dataUsingEncoding:NSUTF8StringEncoding];
Byte *bytes = (Byte *)[myD bytes];
//下面是Byte 转换为16进制。
NSString *hexStr=@"";
for(int i=0;i<[myD length];i++) {
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
if([newHexStr length]==1)
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
else
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
}
return hexStr;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)