• 利用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

  • 相关阅读:
    如何使用 vimdiff 来 git diff /svn diff
    nginx https ssl 设置受信任证书[原创]
    Nginx配置proxy_pass转发的/路径问题
    116、Android获取Manifest中<meta-data>元素的值
    Android Studio系列教程四--Gradle基础(转载)
    Android Studio系列教程六--Gradle多渠道打包(转载)
    1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco
    Java数组转成list,list转数组
    115、定时器(TimerTask+Timer+Handler)
    114、Android禁止ViewPager的左右滑动
  • 原文地址:https://www.cnblogs.com/wangxianjin/p/12655351.html
Copyright © 2020-2023  润新知