IOS开发 -- 利用GMObjC进行SM2,SM4加解密

IOS开发 -- 利用GMObjC进行SM2,SM4加解密,第1张

"GMObjC"github链接 在podfile里添加: pod 'GMObjC' SM2的加密  SM2PubKey替换为公钥
+(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;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/997010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存