利用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加密解密按钮中的代码

下载地址:https://download.csdn.net/download/my_aa/12309197

猜你喜欢

转载自www.cnblogs.com/wangxianjin/p/12655351.html