国密算法学习笔记

国密算法学习笔记

国密算法简介

国密算法是由中国密码学专家自主设计并发布的一系列密码算法,它们包括SM1、SM2、SM3、SM4等。

SM1是一种对称加密算法,采用128位密钥长度,支持分组长度为64位或者128位,具有较高的安全性和性能。

SM2是一种非对称加密算法,基于椭圆曲线密码体制,具有与RSA算法相当的安全性,同时具有更高的运算速度和更短的密钥长度。SM2算法主要用于数字签名、密钥交换、加密和解密等方面的应用。

SM3是一种密码杂凑算法,用于实现消息摘要的功能,具有较高的安全性和性能。

SM4是一种对称加密算法,采用128位密钥长度,支持分组长度为128位,具有高效、安全、易用等特点,已成为国家标准。

国密算法主要应用于政务、金融、电信、移动支付等领域,以保障重要数据的安全性。同时,国密算法也已经逐渐被国际社会所认可和采用。

国密算法C++可以使用的第三方库

GMSSL(国密SSL):是一个由OSCCA(OpenSSL Software Foundation in China)开发的开源软件包,它实现了SM2,SM3,SM4等多种国密算法,并提供了与OpenSSL兼容的API接口,可以方便地在C++中使用。

Botan:是一个跨平台的密码学库,支持多种密码算法,包括国密算法SM2,SM3和SM4等。它提供了简单易用的API接口,可以方便地在C++中使用。

Crypto++:是一个流行的密码学库,支持多种密码算法,包括国密算法SM2,SM3和SM4等。它提供了丰富的API接口,可以方便地在C++中使用。

mbed TLS:是一个轻量级的加密库,支持多种密码算法,包括国密算法SM2,SM3和SM4等。它提供了简单易用的API接口,可以方便地在C++中使用。

以上是一些常用的C++国密第三方库,你可以根据自己的需求选择其中一个来使用。请注意,在使用国密算法时,需要遵循国家相关的法律法规。

mbedTLS 官方版本不支持国密

mbedTLS的官方地址: https://tls.mbed.org/
mbedTLS的官方文档地址:https://mbed-tls.readthedocs.io/en/latest/
GitHub仓库地址: https://github.com/ARMmbed/mbedtls

mbedTLS(前身为PolarSSL)是一个开源的轻量级加密和SSL/TLS协议库,它提供了一些常用的加密算法和协议实现,包括AES、SM4、SHA-1、SHA-256、RSA、ECDH、TLS、DTLS等。它被广泛用于物联网、安全通信、云服务等领域的安全通信。

mbedTLS库的特点如下:

轻量级:mbedTLS库的代码量很小,体积较小,易于嵌入到各种设备中。
可移植性:mbedTLS库可以运行在各种平台和操作系统上,包括嵌入式系统和桌面系统。
安全性:mbedTLS库提供了一些流行的加密算法和协议的实现,并且它经过了广泛的安全测试和评估,可靠性很高。
简单易用:mbedTLS库提供了易于使用的API,方便开发人员使用和集成到应用程序中。
mbedTLS库可以使用C语言编写,并且是开源的,可在GNU Lesser General Public License(LGPL)下使用。

# root @ ubuntu in /opt/hrs-server/java on git:v2.01.05 o [1:50:44] 
$ apt-cache search mbed |grep dev | grep mbedtls
libmbedtls-dev - lightweight crypto and SSL/TLS library - development files
# root @ ubuntu in /opt/hrs-server/java on git:v2.01.05 o [1:52:47] 
$ apt-cache show libmbedtls-dev
Package: libmbedtls-dev
Architecture: amd64
Version: 2.8.0-1
Multi-Arch: same
Priority: optional
Section: universe/libdevel
Source: mbedtls
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: James Cowgill <jcowgill@debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 2116
Depends: libmbedcrypto1 (= 2.8.0-1), libmbedtls10 (= 2.8.0-1), libmbedx509-0 (= 2.8.0-1)
Suggests: libmbedtls-doc
Filename: pool/universe/m/mbedtls/libmbedtls-dev_2.8.0-1_amd64.deb
Size: 381764
MD5sum: 24c030f986eba86580f29207ad182f01
SHA1: b274b40b51e98b84908eb967b90ab14388fc3447
SHA256: 2e1f16130648644d131d9fe79022a24a66bd1b1f79ff61aebffe6f0d5b144957
Homepage: https://tls.mbed.org/
Description-en: lightweight crypto and SSL/TLS library - development files
 mbed TLS (formerly known as PolarSSL) is a lean open source crypto library for
 providing SSL and TLS support in your programs. It offers an intuitive API and
 documented header files, so you can actually understand what the code does.
 It features:
  - Symmetric algorithms, like AES, Blowfish, Triple-DES, DES, ARC4, Camellia
    and XTEA
  - Hash algorithms, like SHA-1, SHA-2, RIPEMD-160 and MD5
  - Entropy pool and random generators, like CTR-DRBG and HMAC-DRBG
  - Public key algorithms, like RSA, Elliptic Curves, Diffie-Hellman, ECDSA
    and ECDH
  - TLS 1.0, 1.1 and 1.2
  - Abstraction layers for ciphers, hashes, public key operations, platform
    abstraction and threading
 .
 This package contains the header files and static libraries for mbed TLS.
Description-md5: 40f9a71b90e23ccf34a190093807138a

# root @ ubuntu in /opt/hrs-server/java on git:v2.01.05 o [1:50:53] 
$ apt-cache depends libmbedtls-dev
libmbedtls-dev
  Depends: libmbedcrypto1
  Depends: libmbedtls10
  Depends: libmbedx509-0
  Suggests: libmbedtls-doc
# root @ ubuntu in /opt/hrs-server/java on git:v2.01.05 o [2:01:22] C:1
$ dpkg -L libmbedtls-dev |grep sm4.h

在ubuntu18.04的apt源中,有这个库可以下载使用,但是没有sm4.h文件,估计是版本太低。

SM4加密示例

#include <stdio.h>
#include "mbedtls/config.h"
#include "mbedtls/platform.h"
#include "mbedtls/aes.h"
#include "mbedtls/sm4.h"

int main(void)
{
    int ret;
    mbedtls_sm4_context ctx;
    unsigned char key[16] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
    unsigned char iv[16] = {0};
    unsigned char input[16] = {0x68, 0x75, 0x61, 0x6e, 0x67, 0x6a, 0x69, 0x65, 0x6c, 0x69, 0x61, 0x6e, 0x67, 0x79, 0x61, 0x6e};
    unsigned char output[16] = {0};
    
    // 初始化SM4上下文
    mbedtls_sm4_init(&ctx);
    
    // 设置SM4解密密钥
    ret = mbedtls_sm4_setkey_dec(&ctx, key, 128);
    if (ret != 0) {
        printf("mbedtls_sm4_setkey_dec failed with error code: %d\n", ret);
        goto exit;
    }
    
    // 使用SM4 CBC模式进行解密
    ret = mbedtls_sm4_crypt_cbc(&ctx, MBEDTLS_SM4_DECRYPT, sizeof(input), iv, input, output);
    if (ret != 0) {
        printf("mbedtls_sm4_crypt_cbc failed with error code: %d\n", ret);
        goto exit;
    }
    
    // 输出解密结果
    printf("Decrypt output: ");
    for (int i = 0; i < sizeof(output); i++) {
        printf("%02x", output[i]);
    }
    printf("\n");
    
exit:
    // 清除SM4上下文
    mbedtls_sm4_free(&ctx);
    
    return ret;
}

SM4解密示例

#include <stdio.h>
#include "mbedtls/config.h"
#include "mbedtls/platform.h"
#include "mbedtls/aes.h"
#include "mbedtls/sm4.h"

int main(void)
{
    int ret;
    mbedtls_sm4_context ctx;
    unsigned char key[16] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
    unsigned char iv[16] = {0};
    unsigned char input[16] = {0x68, 0x75, 0x61, 0x6e, 0x67, 0x6a, 0x69, 0x65, 0x6c, 0x69, 0x61, 0x6e, 0x67, 0x79, 0x61, 0x6e};
    unsigned char output[16] = {0};
    
    // 初始化SM4上下文
    mbedtls_sm4_init(&ctx);
    
    // 设置SM4解密密钥
    ret = mbedtls_sm4_setkey_dec(&ctx, key, 128);
    if (ret != 0) {
        printf("mbedtls_sm4_setkey_dec failed with error code: %d\n", ret);
        goto exit;
    }
    
    // 使用SM4 CBC模式进行解密
    ret = mbedtls_sm4_crypt_cbc(&ctx, MBEDTLS_SM4_DECRYPT, sizeof(input), iv, input, output);
    if (ret != 0) {
        printf("mbedtls_sm4_crypt_cbc failed with error code: %d\n", ret);
        goto exit;
    }
    
    // 输出解密结果
    printf("Decrypt output: ");
    for (int i = 0; i < sizeof(output); i++) {
        printf("%02x", output[i]);
    }
    printf("\n");
    
exit:
    // 清除SM4上下文
    mbedtls_sm4_free(&ctx);
    
    return ret;
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 算法个人学习笔记pdf是一种以电子文档形式呈现的算法学习笔记资源。在这个pdf中,个人学习者可以记录和整理自己在学习算法过程中的思考、心得和解题方法。在这个学习笔记pdf中,个人学习者可以自由地添加和编辑自己的学习内容,包括算法的原理、算法实现的代码以及相应的思路和分析。通过这种方式,个人学习者可以更系统地学习和理解算法,并且能够随时查看自己的学习进展和学习成果。 通过编写和整理算法个人学习笔记pdf,个人学习者可以更好地理解和应用学习到的算法知识。这种记录和整理的过程可以帮助个人学习者更深入地思考问题和解决问题的方法,同时也可以帮助个人学习者更好地复习和回顾已学习算法知识。 对于其他学习者来说,算法个人学习笔记pdf也是一个宝贵的学习资源。其他学习者可以通过查阅个人学习者的学习笔记pdf,借鉴和学习其中的思路和方法。这样可以帮助其他学习者更好地理解和应用算法知识,同时也可以促进知识的分享和交流。 总的来说,算法个人学习笔记pdf是一个为个人学习者提供记录和整理学习过程的工具,同时也是一个为其他学习者提供学习资源和参考的媒介。通过编写和整理算法个人学习笔记pdf,个人学习者可以更好地学习和理解算法知识,同时也可以促进算法知识的分享和交流。 ### 回答2: 算法个人学习笔记pdf是一份记录个人学习算法的文档,具有以下特点和优势。 首先,这份学习笔记是以PDF格式保存的,这意味着可以在任何设备上方便地查看和阅读,无需依赖特定的平台或软件。无论是在电脑、平板还是手机上,都可以轻松地浏览和学习。 其次,这份学习笔记是个人整理的,因此具有个性化的特点。不同的人在学习算法时可能会关注和理解的重点有所不同,通过个人学习笔记,可以反映出个人对算法知识的理解和思考。这样的学习笔记对于个人的学习和复习过程非常有帮助。 此外,这份学习笔记应当具有清晰的结构和逻辑。算法知识通常是有层次结构的,基本的知识点和概念通常是必须掌握的基础,而进阶的知识则需要在掌握基础知识的基础上构建。学习笔记应当按照这个结构和逻辑进行组织,便于学习者理解和掌握。 最后,这份学习笔记应当具有实例和练习题。算法知识的学习不能仅仅停留在理论层面,还需要通过实际的例子和练习题进行实践和巩固。学习笔记应当包含这些实例和练习题,并给出相应的解析和答案,方便学习者进行练习和巩固。 总而言之,算法个人学习笔记pdf是一份方便、个性化、结构清晰、包含实例和练习题的文档,对于学习者来说非常有价值。 ### 回答3: 算法学习笔记PDF是一份用于记录个人学习算法的文档。通过编写学习笔记,我可以对算法的理论和实践有更深入的理解和掌握。 首先,在学习算法的过程中,理论与实践结合是非常重要的。在学习笔记中,我可以记录下算法的原理和相关的数学推导,以及对应的代码实现和应用场景。通过这样的记录方式,我可以更好地理解算法的本质和使用方式。 其次,学习笔记可以帮助我回顾和巩固所学的知识。通过整理和总结学习笔记,我可以梳理出算法的基础知识和重要思想,并将其记忆固定下来。同时,学习笔记也可以作为复习的资料,提供方便快捷的回顾方式。 此外,学习笔记还可以促进自我思考和学习方法的改进。在编写笔记的过程中,我可以思考和提出自己的问题,并通过查阅相关资料和与他人讨论,来找到问题的答案和解决方案。这样的思考过程可以帮助我提高问题解决的能力和学习效果。 最后,学习笔记可以与他人分享和交流。通过分享学习笔记,我可以与其他学习者进行交流和讨论,互相学习和提高。同时,学习笔记也可以作为自己学习和成长的见证,激励自己坚持学习和进步。 总之,算法个人学习笔记PDF是一份记录、回顾、思考和分享的文档,对于个人的算法学习具有重要的意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值