利用PBFunc在Powerbuilder中进行国密SM4的加密解密操作
利用PBFunc的n_pbfunc_cryp对象可以很方便的进行SM4的加密解密操作,其中ECB不需要向量IV,其它模式需要IV
代码下载地址:https://download.csdn.net/download/my_aa/12309197
- SM4加密:
1 //可用 http://aks.jd.com/tools/sec/ 对比结果 2 string ls_data 3 ls_data = sle_1.Text//要加密的数据 4 string ls_key 5 ls_key = sle_key.Text//128位(16 * 8) 6 string ls_IV 7 //CBC模式需要向量iv,ECB模式忽略该参数值 8 ls_IV= "8a6c4ddd8a6c4ddd"//iv 9 10 n_pbfunc_cryp lnv_cryp 11 //设置加密后的内容格式 12 string ls_out_code 13 IF rb_result_base64.checked Then 14 ls_out_code = lnv_cryp.HASH_RESULT_BASE64//Base64编码 15 Else 16 ls_out_code = lnv_cryp.HASH_RESULT_HEX//16进制 17 End IF 18 //数据编码格式 19 long ll_dataEndCode 20 IF rb_utf8.checked then//utf-8编码 21 ll_dataEndCode = lnv_cryp.DataEncode_UTF8 22 else 23 ll_dataEndCode = lnv_cryp.DataEncode_DEFAULT 24 End IF 25 //模式选择 26 string ls_CipherMode 27 ls_CipherMode = ddlb_chipermode.Text 28 long ll_CipherMode 29 IF ls_CipherMode = "ECB" Then 30 ll_CipherMode = lnv_cryp.CipherMode_ECB /*ECB模式*/ 31 else 32 ll_CipherMode = lnv_cryp.CipherMode_CBC /*CBC模式*/ 33 End IF 34 //密钥长度位,一个字符为8位,128即为16个字符,192为24个字符,256为32个字符 35 long ll_keyLen 36 IF ddlb_keylen.Text="128" Then 37 ll_keyLen = 128 38 elseIF ddlb_keylen.Text="192" Then 39 ll_keyLen = 192 40 elseIF ddlb_keylen.Text="256" Then 41 ll_keyLen = 256 42 else 43 ll_keyLen = 128 44 End IF 45 string ls_out 46 //进行加密 47 IF lnv_cryp.of_sm4_encrypt(& 48 ll_CipherMode, /*模式*/ & 49 lnv_cryp.PaddingMode_PKCS5, /*PKCS5填充方式*/ & 50 ll_keyLen, /*密钥位长度*/& 51 ls_data,ls_key,ls_IV, & 52 ll_dataEndCode,& 53 ls_out_code,/*加密后的内容编码*/ & 54 ls_out) then 55 mle_1.Text = ls_out//加密后内容 56 else 57 messageBox("","加密失败") 58 End IF 59
- SM4解密
1 //可用 http://tool.chacuo.net/cryptaes 对比结果 2 string ls_data 3 ls_data = mle_1.Text//要解密的数据 4 5 string ls_key 6 ls_key = sle_key.Text//128位(16 * 8) 7 8 string ls_IV 9 //CBC模式需要向量iv,ECB模式忽略该参数值 10 ls_IV= "8a6c4ddd8a6c4ddd"//iv 11 12 13 n_pbfunc_cryp lnv_cryp 14 15 //设置加密后的内容格式 16 string ls_out_code 17 IF rb_result_base64.checked Then 18 ls_out_code = lnv_cryp.HASH_RESULT_BASE64//Base64编码 19 Else 20 ls_out_code = lnv_cryp.HASH_RESULT_HEX//16进制 21 End IF 22 23 long ll_dataEndCode 24 IF rb_utf8.checked then//utf-8编码 25 ll_dataEndCode = lnv_cryp.DataEncode_UTF8 26 else 27 ll_dataEndCode = lnv_cryp.DataEncode_DEFAULT 28 End IF 29 30 //模式选择 31 string ls_CipherMode 32 ls_CipherMode = ddlb_chipermode.Text 33 34 long ll_CipherMode 35 IF ls_CipherMode = "ECB" Then 36 ll_CipherMode = lnv_cryp.CipherMode_ECB /*ECB模式*/ 37 else 38 ll_CipherMode = lnv_cryp.CipherMode_CBC /*CBC模式*/ 39 End IF 40 41 //密钥长度位,一个字符为8位,128即为16个字符,192为24个字符,256为32个字符 42 long ll_keyLen 43 IF ddlb_keylen.Text="128" Then 44 ll_keyLen = 128 45 elseIF ddlb_keylen.Text="192" Then 46 ll_keyLen = 192 47 elseIF ddlb_keylen.Text="256" Then 48 ll_keyLen = 256 49 else 50 ll_keyLen = 128 51 End IF 52 53 blob ls_out//解密后的内容 54 long ll_outLen//解密后的内容长度(字节数) 55 //以下进行解密 56 IF lnv_cryp.of_sm4_decrypt(& 57 ll_CipherMode, /*模式*/ & 58 lnv_cryp.PaddingMode_PKCS5, /*PKCS5填充方式*/ & 59 ll_keyLen, /*密钥位长度*/& 60 ls_data,ls_key,ls_IV, & 61 ls_out_code,/*加密后的内容编码*/ & 62 ls_out,ll_outLen) then 63 IF rb_utf8.checked then//utf-8编码 64 sle_2.Text = lnv_cryp.of_utf8ToGbk(ls_out,ll_outLen) 65 else 66 sle_2.Text = string(ls_out) 67 End IF 68 else 69 messagebox("","解密失败") 70 End IF
具体参考w_encrypt的SM4加密解密按钮中的代码