PB实现国密SM2/SM3/SM4算法(DLL方式)

SM4

SM4简介

SM4是一种数据分组加密算法,可以类比DES、AES等常用的分组加密算法。SM4为对称加密,分组长度和秘钥长度均为16字节。

分组加密模式ECB与CBC

ECB模式直接对明文的每个分块加密,流程如下图:
在这里插入图片描述
CBC模式将第1个分块与初始化向量IV异或运算后再加密,再将第N个分块与第N-1个分块加密值的异或运算结果进行加密,流程图如下:
在这里插入图片描述

ECB模式加密解密

秘钥:
1234567812345678

待加密文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

加密代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
blob lblb_key, lblb_text, lblb_encrypted
string ls_text, ls_encrypted

lblb_key = blob('1234567812345678')

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

gm.sm4_ecb_encrypt( lblb_text, lblb_key, lblb_encrypted)
ls_encrypted = code_util.base64_encode( lblb_encrypted)

return 0

在这里插入图片描述
得到密文:
USnxwnysSyczfnzWrouvfsXiR5dVhPcMUU6Lth/HQZHrr6ArzeRtQFlEoXEp3AFpTvAb/RFnw2WbZprFZ7AWbX4fmhc4lQSrP+94xTrn/KI=

接下来,解密上面得到的密文
解密代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
blob lblb_key, lblb_text, lblb_encrypted
string ls_text, ls_encrypted

lblb_key = blob('1234567812345678')

ls_encrypted = 'USnxwnysSyczfnzWrouvfsXiR5dVhPcMUU6Lth/HQZHrr6ArzeRtQFlEoXEp3AFpTvAb/RFnw2WbZprFZ7AWbX4fmhc4lQSrP+94xTrn/KI='
lblb_encrypted = code_util.base64_decode( ls_encrypted)

gm.sm4_ecb_decrypt( lblb_encrypted, lblb_key, lblb_text)
ln_charset.from_utf8(lblb_text, ls_text)

return 0

在这里插入图片描述
得到解密后的文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

CBC模式加密解密

秘钥:
1234567812345678

初始化向量IV:
a1b2c3d4e5f6g7h8

待加密文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

加密代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
blob lblb_key, lblb_iv, lblb_text, lblb_encrypted
string ls_text, ls_encrypted

lblb_key = blob('1234567812345678')
lblb_iv = blob('a1b2c3d4e5f6g7h8')

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

gm.sm4_cbc_encrypt( lblb_text, lblb_key, lblb_iv, lblb_encrypted)
ls_encrypted = code_util.base64_encode( lblb_encrypted)

return 0

在这里插入图片描述

得到密文:
cBpwNbKHVF0UbOwQtmeO20L+vc/YMONxtlfUfFTRZaAtcBmpZEe8AuXN5cctDn9KJ0qCjrCNntio8pRZuTDaYaQBHcdG7qXqv7iHhmOVPj8=

接下来,解密上面得到的密文
解密代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
blob lblb_key, lblb_iv, lblb_text, lblb_encrypted
string ls_text, ls_encrypted

lblb_key = blob('1234567812345678')
lblb_iv = blob('a1b2c3d4e5f6g7h8')

ls_encrypted = 'cBpwNbKHVF0UbOwQtmeO20L+vc/YMONxtlfUfFTRZaAtcBmpZEe8AuXN5cctDn9KJ0qCjrCNntio8pRZuTDaYaQBHcdG7qXqv7iHhmOVPj8='
lblb_encrypted = code_util.base64_decode( ls_encrypted)

gm.sm4_cbc_decrypt( lblb_encrypted, lblb_key, lblb_iv, lblb_text)
ln_charset.from_utf8(lblb_text, ls_text)

return 0

在这里插入图片描述

得到解密后的文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

SM3

SM3简介

SM3是一种消息摘要算法,可以类比MD5、SHA256等常用的消息摘要算法。SM3算法生成的消息摘要长度为32字节。

SM3摘要生成

消息文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

计算SM3摘要代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
string ls_text, ls_sm3
blob lblb_text, lblb_sm3

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

gm.sm3_digest( lblb_text, lblb_sm3)
ls_sm3 = code_util.hex_encode(lblb_sm3)

return 0

在这里插入图片描述
得到SM3消息摘要:
640BA3331EFB8B017F4B34A94B8BB7D94AA564767C031F1917C440934CFE834C

SM3WithSM2摘要生成

SM3WithSM2摘要算法基于SM3算法,主要是作为SM2签名算法的摘要算法使用,SM2签名算法见后文,这里先单独演示SM3WithSM2算法的使用

公钥BASE64:
agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q==

消息文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

计算SM3WithSM2摘要代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
string ls_text, ls_sm3_with_sm2
blob lblb_text, lblb_public_key, lblb_sm3_with_sm2
string ls_public_key

ls_public_key = 'agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q=='
lblb_public_key = code_util.base64_decode( ls_public_key)

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

gm.sm3_with_sm2_digest( lblb_text, lblb_public_key, lblb_sm3_with_sm2)
ls_sm3_with_sm2 = code_util.hex_encode(lblb_sm3_with_sm2)

return 0

在这里插入图片描述
得到SM3WithSM2消息摘要:
F4261292B3BE90400DB813085A3BE0329021073FF2E792CD0C2D4F2E4443EE8C

SM2

SM2简介

SM2是一种非对称加密算法,包含数字签名算法和公钥加密算法,可以类比常用的RSA算法。

SM2签名与验签

常用签名算法签名和验签的流程如下:
在这里插入图片描述
签名算法需要搭配摘要算法使用,SM2签名常用的摘要算法是上文中的SM3WithSM2算法

下面开始演示SM2签名与验签

公钥BASE64:
agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q==

私钥BASE64:
YWJjZGVmZ2gxMjM0NTY3ODg3NjU0MzIxaGdmZWRjYmE=

消息文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

计算SM2签名代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
string ls_text
blob lblb_text, lblb_public_key, lblb_private_key, lblb_sign
string ls_public_key, ls_private_key, ls_sign

ls_public_key = 'agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q=='
ls_private_key = 'YWJjZGVmZ2gxMjM0NTY3ODg3NjU0MzIxaGdmZWRjYmE='
lblb_public_key = code_util.base64_decode( ls_public_key)
lblb_private_key = code_util.base64_decode( ls_private_key)

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

gm.sm2_sign_by_sm3( lblb_text, lblb_private_key, lblb_public_key, lblb_sign)
ls_sign = code_util.base64_encode( lblb_sign)

return 0

在这里插入图片描述
得到SM2签名的BASE64编码如下:
fd9JKrBDUMrzE6xGfsfPyb0p7n9ZFyuY8meraGHwndkJU5yswlmI3UIMy2rNQTP3CG4wBaZgF5z/IqHBcdIx9Q==

SM2签名算法的过程中有使用随机数,所以每次计算的签名值可能都不同

下面用这个签名测试验签

验证SM2签名代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
string ls_text
blob lblb_text, lblb_public_key, lblb_private_key, lblb_sign
string ls_public_key, ls_private_key, ls_sign
long ll_verify_1, ll_verify_2

ls_public_key = 'agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q=='
lblb_public_key = code_util.base64_decode( ls_public_key)

ls_sign = 'fd9JKrBDUMrzE6xGfsfPyb0p7n9ZFyuY8meraGHwndkJU5yswlmI3UIMy2rNQTP3CG4wBaZgF5z/IqHBcdIx9Q=='
lblb_sign = code_util.base64_decode( ls_sign)

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

ll_verify_1 = gm.sm2_verify_by_sm3( lblb_text, lblb_public_key, lblb_sign)

blobedit(lblb_text, 7, char(37))
ll_verify_2 = gm.sm2_verify_by_sm3( lblb_text, lblb_public_key, lblb_sign)

return 0

在这里插入图片描述
用原始的消息和签名值验签,验签方法返回0,验签成功
若篡改了原始的消息,验签方法返回-1,验签失败

SM2加密与解密

公钥BASE64:
agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q==

私钥BASE64:
YWJjZGVmZ2gxMjM0NTY3ODg3NjU0MzIxaGdmZWRjYmE=

消息文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

SM2公钥加密代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
string ls_text
blob lblb_text, lblb_public_key, lblb_encrypted
string ls_public_key, ls_encrypted

ls_public_key = 'agqV3MU7WaQCpAHHhVV8GDolxHqx3PfLbSEOhmtz1U271UjRN6j0I4D4Cn/MEpbMrl+SAsFHWwaXd5+SoLZq6Q=='
lblb_public_key = code_util.base64_decode( ls_public_key)

ls_text = '1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法'
ln_charset.to_utf8(ls_text, lblb_text)

gm.sm2_encrypt( lblb_text, lblb_public_key, lblb_encrypted)
ls_encrypted = code_util.base64_encode( lblb_encrypted)

return 0

在这里插入图片描述
得到SM2密文的BASE64编码如下:
xsnyO8X2sJ2jl2sH5C3llxgNoYghqQhgd3f+em9NyXhvlF1dgba8UklF3XEk8u5STngWW431wVNm1pVsXlhIZKa7iSGcm5ez9ZMgvbAna5QjRfXvVmC2yeBuyFOi9zru5LLr9OxYjQm4x32qMRUZUlq5s5C6ChK+Qc4PFVk5iL6DrlLL2a0309xAdSUpmPupqUWYmwRE9lFtyPnqI04WblVHiBkpR64l6Y4=

SM2加密算法的过程中有使用随机数,所以每次计算的密文可能都不同

下面用这个密文测试解密

SM2私钥解密代码及运行效果如下:

n_gm gm
n_func_charset ln_charset
n_code_util code_util
string ls_text
blob lblb_text, lblb_private_key, lblb_encrypted
string ls_private_key, ls_encrypted

ls_private_key = 'YWJjZGVmZ2gxMjM0NTY3ODg3NjU0MzIxaGdmZWRjYmE='
lblb_private_key = code_util.base64_decode( ls_private_key)

ls_encrypted = 'xsnyO8X2sJ2jl2sH5C3llxgNoYghqQhgd3f+em9NyXhvlF1dgba8UklF3XEk8u5STngWW431wVNm1pVsXlhIZKa7iSGcm5ez9ZMgvbAna5QjRfXvVmC2yeBuyFOi9zru5LLr9OxYjQm4x32qMRUZUlq5s5C6ChK+Qc4PFVk5iL6DrlLL2a0309xAdSUpmPupqUWYmwRE9lFtyPnqI04WblVHiBkpR64l6Y4='
lblb_encrypted = code_util.base64_decode( ls_encrypted)

gm.sm2_decrypt( lblb_encrypted, lblb_private_key, lblb_text)
ln_charset.from_utf8(lblb_text, ls_text)

return 0

在这里插入图片描述
得到解密后的文本:
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法

说明

本文代码的测试环境为PowerBuilder Version 8.0.2 Build 9506
项目下载

  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值