Openssl+sm4开发实例(含源码)

这篇具有很好参考价值的文章主要介绍了Openssl+sm4开发实例(含源码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、SM4算法介绍

SM4(国密算法)是由中国国家密码管理局(State Cryptography Administration,SCA)提出的分组密码算法,是一种对称加密算法。它是中国国家商用密码算法,也是 ISO/IEC 标准(ISO/IEC 18033-3:2010)中的一部分。SM4 算法被广泛用于中国国内的商用加密应用中。

以下是 SM4 算法的主要特点和结构:

1.1 SM4特点

  1. 分组密码: SM4 是一种分组密码,它将明文和密钥按照固定长度的分组进行加密和解密。

  2. 分组长度: 分组长度为 128 位(16 字节)。

  3. 密钥长度: 支持密钥长度为 128 位(16 字节)。

  4. 加密模式: SM4 支持 ECB(Electronic Codebook)模式,这是一种基本的分组密码加密模式。

  5. 代替和置换网络(Substitution-Permutation Network,SPN)结构: SM4 算法采用 SPN 结构,包括多轮的代替(Substitution)和置换(Permutation)操作,以增加加密的难度和安全性。

  6. 非线性和线性运算: SM4 算法中的代替操作(S-Box 替代)是非线性的,而置换操作是线性的,这种结合增加了算法的安全性。

1.2 SM4安全性

SM4 算法的设计目标是提供高度的安全性,抵抗各种已知的攻击。它经过了广泛的密码学分析和测试,并且已经被国际上的密码学专家接受。

1.3 SM4使用场景

SM4 算法主要用于商用加密领域,例如金融领域的安全支付、电子身份认证、电子票据等。

SM4 算法的具体细节和设计原理可以在国家密码管理局的官方文档中找到。请注意,SM4 算法是受到专利保护的,使用 SM4 算法需要遵循相关的法律法规和标准。

二、SM4加密模式

  • ECB(Electronic Codebook)模式:ECB 模式将明文分成固定大小的块,然后每个块单独加密,加密后的块串联起来形成密文。在 ECB 模式下,相同的明文块会被加密成相同的密文块,因此 ECB 模式不提供重放攻击的保护,而且不适用于对长文本的加密,因为长文本可能会有相同的块,导致相同的密文块。

  • CBC 模式(Cipher Block Chaining): 在 CBC 模式中,每个明文块在加密之前会与前一个密文块进行异或运算。这样可以使相同的明文块在加密时得到不同的密文块,增加了安全性。

  • CFB 模式(Cipher Feedback): CFB 模式中,密文块被反馈到加密算法的输入,然后再与明文进行异或运算,生成密文。CFB 模式可以实现分位加密,适用于流数据的加密。

  • OFB 模式(Output Feedback): OFB 模式中,密文块被反馈到加密算法的输入,生成一个密钥流(keystream),然后将密钥流与明文进行异或运算,生成密文。OFB 模式可以实现分位加密,且具有自同步性质。

  • CTR 模式(Counter): CTR 模式中,每个明文块都与一个唯一的计数器值进行加密,计数器的值可以是明文块的块序号。CTR 模式不需要反馈,可以并行加密,适用于高速加密需求。

三、SM4开发实例

以下是一个使用 OpenSSL 中 SM4 算法进行加密和解密的 C++ 代码示例:

#include <openssl/evp.h>
#include <openssl/rand.h>
#include <iostream>

// 加密函数
void encryptSM4(const unsigned char *plaintext, int plaintextLength, const unsigned char *key, unsigned char *ciphertext, int *ciphertextLength) {
    EVP_CIPHER_CTX *ctx;
    int len;

    // 创建并初始化上下文
    ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL);

    // 加密数据
    EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintextLength);
    *ciphertextLength = len;

    // 结束加密过程
    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
    *ciphertextLength += len;

    // 释放上下文
    EVP_CIPHER_CTX_free(ctx);
}

// 解密函数
void decryptSM4(const unsigned char *ciphertext, int ciphertextLength, const unsigned char *key, unsigned char *plaintext, int *plaintextLength) {
    EVP_CIPHER_CTX *ctx;
    int len;

    // 创建并初始化上下文
    ctx = EVP_CIPHER_CTX_new();
    EVP_DecryptInit_ex(ctx, EVP_sm4_ecb(), NULL, key, NULL);

    // 解密数据
    EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertextLength);
    *plaintextLength = len;

    // 结束解密过程
    EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
    *plaintextLength += len;

    // 释放上下文
    EVP_CIPHER_CTX_free(ctx);
}

int main() {
    const unsigned char plaintext[] = "Hello, SM4!"; // 明文
    const unsigned char key[] = "0123456789abcdef"; // 128位密钥
    unsigned char ciphertext[256];
    unsigned char decryptedText[256];
    int ciphertextLength = 0;
    int decryptedLength = 0;

    // 加密
    encryptSM4(plaintext, sizeof(plaintext) - 1, key, ciphertext, &ciphertextLength);

    // 打印密文
    std::cout << "Ciphertext: ";
    for (int i = 0; i < ciphertextLength; ++i) {
        printf("%02x", ciphertext[i]);
    }
    std::cout << std::endl;

    // 解密
    decryptSM4(ciphertext, ciphertextLength, key, decryptedText, &decryptedLength);

    // 打印解密后的明文
    std::cout << "Decrypted Text: " << decryptedText << std::endl;

    return 0;
}

在这个示例中,encryptSM4() 函数用于加密,decryptSM4() 函数用于解密。请确保你的 OpenSSL 版本支持 SM4 算法,通常 OpenSSL 版本在 1.1.0 及以上才支持 SM4。编译时,确保你正确链接了 OpenSSL 库,命令如下:

g++ -o sm4_example main.cc -lssl -lcrypto

运行程序后,你会看到打印出的密文和解密后的明文。请记住,SM4 的安全性依赖于密钥的安全性,因此在实际应用中,请确保你的密钥是安全的。
Openssl+sm4开发实例(含源码),openssl,密码学,ssl,c++,linux,同态加密,1024程序员节

四、代码地址

https://gitcode.net/arv002/qt/-/tree/master/Openssl/symmetric_encryption/sm4文章来源地址https://www.toymoban.com/news/detail-737466.html

到了这里,关于Openssl+sm4开发实例(含源码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenSSL3.0.1中SM4算法分析

    SM4分组密码算法是我国自主设计的分组对称密码算法,用于实现数据的加密/解密运算,以保证数据和信息的机密性。要保证一个对称密码算法的安全性的基本条件是其具备足够的密钥长度,SM4算法与AES算法具有相同的密钥长度分组长度128比特,因此在安全性上高于3DES算法。

    2024年02月06日
    浏览(33)
  • 探索密码学的未来:SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算

    密码算法在现代通信与信息安全中发挥着至关重要的作用,SM1、SM2、SM3、SM4、同态加密、密态计算、隐私计算和安全多方计算等密码算法被广泛应用于各种信息安全领域。本篇博客将会为大家介绍这些密码算法,以及它们在信息安全中的作用和应用。 SM1、SM2、SM3、SM4是中国国

    2024年02月08日
    浏览(44)
  • 密码学之对称加密体系(2):AES、SM4的 S 盒具体算法的实现

    🔥点击进入【硬件安全】社区,查看更多精彩内容🔥 🔥点击查看《硬件安全》系列文章🔥 📢  声明 : 🥭 作者主页:【摆渡沧桑的CSDN主页】。 ⚠️ 未经作者允许,禁止转载。 ⚠️ 本文为非盈利性质,目的为个人学习记录及知识分享。因能力受限,存在知识点分析不

    2024年02月16日
    浏览(44)
  • HDU密码学-SM4(Java实现,仅针对输入为16进制128bit的明文和密钥)

    1、熟悉分组密码的基本框架。 2、掌握SM4密码的加解密原理。 3、用合适的编程语言实现SM4密码程序并输出结果。 SM4算法是我国商用密码标准,其前身是SMS4算法。SM4算法是一个分组加密算法,分组长度和密钥长度均128bit。SM4算法使用32轮的非线性迭代结构。SM4在最后一轮非线

    2024年02月16日
    浏览(72)
  • openssl基础使用(密码学 linux)

    openssl是Linux内置的一款开源工具,实现了常见的密码算法与应用。通过openssl操作,完成各种密码算法的应用。 创建一个文件,用于被加密,文件内容为12345,文件名为test.txt 一、对称加密 1、使用rc4加解密 加密 这是第一个是设置密码,第二个是重复输入密码。两次必须一样。

    2024年02月10日
    浏览(87)
  • x-cmd pkg | openssl - 密码学开源工具集

    OpenSSL 是一个开源的密码库和 SSL/TLS 协议实现,它提供了一组密码学工具和加密功能,用于保护数据通信的安全性。项目发展历史可以追溯到 1998 年,源自 Eric A. Young 和 Tim J. Hudson 开发的 SSLeay 库,由一群志愿者共同维护和开发,成为广泛用于网络通信、安全证书生成和数据加

    2024年02月03日
    浏览(62)
  • openssl生成SM2公私钥对命令详解

            (1)获得openssl支持椭圆曲线算法列表         命令:openssl ecparam -list_curves         返回结果:   secp112r1 : SECG/WTLS curve over a 112 bit prime field   secp112r2 : SECG curve over a 112 bit prime field   secp128r1 : SECG curve over a 128 bit prime field   secp128r2 : SECG curve over a 128 bit pr

    2024年02月05日
    浏览(47)
  • sm2证书生成(openssl生成公私钥对)—使用

    用上一篇的命令生成公私钥对。 1、sm2PubKey.pem 2、sm2PriKeyPkcs8.pem 3、openssl ec -in sm2PriKeyPkcs8.pem -text 5、工具类 BCECUtil.java SM2Util.java 6、写一个main方法 执行结果: 密钥和命令解析出来的一样。 依赖包:bcprov-jdk15on-1.70.jar SM2加密算法的结果长度,取决于明文长度,没记错的话是

    2024年02月02日
    浏览(38)
  • OpenSSL 3.1.1 ECC 加密、解密、签名、验签(国密 sm2、sm3)

    openssl 3 默认废弃了 旧版本 (opessl 1.x) 的部分api 导致部分旧ecc 代码无法使用(可以通过配置编译选项打开) ,这里展示如何使用新接口用ECC 进行加密解密。 新接口是真的方便,基本上你都不需要懂啥密码学知识,对我们这种密码白痴来说太好了 头文件 生成密钥对 导出公

    2024年02月05日
    浏览(58)
  • C++调用openssl实现国标sm2签名算法的使用

    SM2算法基于ECC椭圆曲线算法,广泛用于区块链、HTTPS 等需要非对称加密的场景。是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。 下面链接可以了解一些关于SM2的基础知识。 椭圆曲线加密算法(E

    2024年01月24日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包