利用PBFunc的n_pbfunc_cryp对象可以很方便的进行SM4的加密解密操作,其中ECB不需要向量IV,其它模式需要IV
代码下载地址:https://download.csdn.net/download/my_aa/12309197
SM4加密:
//可用 http://aks.jd.com/tools/sec/ 对比结果
string ls_data
ls_data = sle_1.Text//要加密的数据
string ls_key
ls_key = sle_key.Text//128位(16 * 8)
string ls_IV
//CBC模式需要向量iv,ECB模式忽略该参数值
ls_IV= "8a6c4ddd8a6c4ddd"//iv
n_pbfunc_cryp lnv_cryp
//设置加密后的内容格式
string ls_out_code
IF rb_result_base64.checked Then
ls_out_code = lnv_cryp.HASH_RESULT_BASE64//Base64编码
Else
ls_out_code = lnv_cryp.HASH_RESULT_HEX//16进制
End IF
//数据编码格式
long ll_dataEndCode
IF rb_utf8.checked then//utf-8编码
ll_dataEndCode = lnv_cryp.DataEncode_UTF8
else
ll_dataEndCode = lnv_cryp.DataEncode_DEFAULT
End IF
//模式选择
string ls_CipherMode
ls_CipherMode = ddlb_chipermode.Text
long ll_CipherMode
IF ls_CipherMode = "ECB" Then
ll_CipherMode = lnv_cryp.CipherMode_ECB /*ECB模式*/
else
ll_CipherMode = lnv_cryp.CipherMode_CBC /*CBC模式*/
End IF
//密钥长度位,一个字符为8位,128即为16个字符,192为24个字符,256为32个字符
long ll_keyLen
IF ddlb_keylen.Text="128" Then
ll_keyLen = 128
elseIF ddlb_keylen.Text="192" Then
ll_keyLen = 192
elseIF ddlb_keylen.Text="256" Then
ll_keyLen = 256
else
ll_keyLen = 128
End IF
string ls_out
//进行加密
IF lnv_cryp.of_sm4_encrypt(&
ll_CipherMode, /*模式*/ &
lnv_cryp.PaddingMode_PKCS5, /*PKCS5填充方式*/ &
ll_keyLen, /*密钥位长度*/&
ls_data,ls_key,ls_IV, &
ll_dataEndCode,&
ls_out_code,/*加密后的内容编码*/ &
ls_out) then
mle_1.Text = ls_out//加密后内容
else
messageBox("","加密失败")
End IF
SM4解密
//可用 http://tool.chacuo.net/cryptaes 对比结果
string ls_data
ls_data = mle_1.Text//要解密的数据
string ls_key
ls_key = sle_key.Text//128位(16 * 8)
string ls_IV
//CBC模式需要向量iv,ECB模式忽略该参数值
ls_IV= "8a6c4ddd8a6c4ddd"//iv
n_pbfunc_cryp lnv_cryp
//设置加密后的内容格式
string ls_out_code
IF rb_result_base64.checked Then
ls_out_code = lnv_cryp.HASH_RESULT_BASE64//Base64编码
Else
ls_out_code = lnv_cryp.HASH_RESULT_HEX//16进制
End IF
long ll_dataEndCode
IF rb_utf8.checked then//utf-8编码
ll_dataEndCode = lnv_cryp.DataEncode_UTF8
else
ll_dataEndCode = lnv_cryp.DataEncode_DEFAULT
End IF
//模式选择
string ls_CipherMode
ls_CipherMode = ddlb_chipermode.Text
long ll_CipherMode
IF ls_CipherMode = "ECB" Then
ll_CipherMode = lnv_cryp.CipherMode_ECB /*ECB模式*/
else
ll_CipherMode = lnv_cryp.CipherMode_CBC /*CBC模式*/
End IF
//密钥长度位,一个字符为8位,128即为16个字符,192为24个字符,256为32个字符
long ll_keyLen
IF ddlb_keylen.Text="128" Then
ll_keyLen = 128
elseIF ddlb_keylen.Text="192" Then
ll_keyLen = 192
elseIF ddlb_keylen.Text="256" Then
ll_keyLen = 256
else
ll_keyLen = 128
End IF
blob ls_out//解密后的内容
long ll_outLen//解密后的内容长度(字节数)
//以下进行解密
IF lnv_cryp.of_sm4_decrypt(&
ll_CipherMode, /*模式*/ &
lnv_cryp.PaddingMode_PKCS5, /*PKCS5填充方式*/ &
ll_keyLen, /*密钥位长度*/&
ls_data,ls_key,ls_IV, &
ls_out_code,/*加密后的内容编码*/ &
ls_out,ll_outLen) then
IF rb_utf8.checked then//utf-8编码
sle_2.Text = lnv_cryp.of_utf8ToGbk(ls_out,ll_outLen)
else
sle_2.Text = string(ls_out)
End IF
else
messagebox("","解密失败")
End IF
具体参考w_encrypt的SM4加密解密按钮中的代码
代码下载地址:https://download.csdn.net/download/my_aa/12309197