赞
踩
SM4是一种数据分组加密算法,可以类比DES、AES等常用的分组加密算法。SM4为对称加密,分组长度和秘钥长度均为16字节。
ECB模式直接对明文的每个分块加密,流程如下图:
CBC模式将第1个分块与初始化向量IV异或运算后再加密,再将第N个分块与第N-1个分块加密值的异或运算结果进行加密,流程图如下:
秘钥:
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 设计了一种算法
秘钥:
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是一种消息摘要算法,可以类比MD5、SHA256等常用的消息摘要算法。SM3算法生成的消息摘要长度为32字节。
消息文本:
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摘要算法基于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是一种非对称加密算法,包含数字签名算法和公钥加密算法,可以类比常用的RSA算法。
常用签名算法签名和验签的流程如下:
签名算法需要搭配摘要算法使用,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,验签失败
公钥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
项目下载
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。