-base64:????????????? Base6"> -base64:????????????? Base6">
117.info
人生若只如初见

OpenSSL如何进行3DES加密

?? OpenSSL ?? 3DES(Triple DES)??,????????????????????????????:

???? OpenSSL ??????? 3DES ??

1. ???????? Base64 ??

echo -n "??????" | openssl enc -des-ede3-cbc -base64

????:

  • -des-ede3-cbc:???? 3DES ??,CBC ???
  • -base64:????????????? Base64 ???,????????

??:

echo -n "Hello, World!" | openssl enc -des-ede3-cbc -base64

????:

U2FsdGVkX1+vupppZksvRf5pq5Jz0=

2. ??????????

openssl enc -des-ede3-cbc -base64 -salt -in plaintext.txt -out encrypted.bin

????:

  • -salt:???????,??????
  • -in plaintext.txt:??????????
  • -out encrypted.bin:??????????

??:

openssl enc -des-ede3-cbc -base64 -salt -in secret.txt -out secret.enc

3. ????

??????????,????????:

openssl enc -d -des-ede3-cbc -base64 -in encrypted.bin -out decrypted.txt

????:

  • -d:???????
  • ???????????

??:

openssl enc -d -des-ede3-cbc -base64 -in secret.enc -out decrypted_secret.txt

???? OpenSSL ??? 3DES ????(? C ????)

???????????????? OpenSSL ?? 3DES ??,??????????:

#include 
#include 
#include 
#include 

int main() {
    const char *plaintext = "Hello, World!";
    const char *key = "123456781234567812345678"; // 24 ????
    const char *iv = "12345678"; // 8 ??????

    EVP_CIPHER_CTX *ctx;
    int len;
    int ciphertext_len;
    unsigned char ciphertext[128];
    unsigned char decryptedtext[128];

    // ????????
    ctx = EVP_CIPHER_CTX_new();
    EVP_EncryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, (unsigned char *)key, (unsigned char *)iv);

    // ????
    EVP_EncryptUpdate(ctx, ciphertext, &len, (unsigned char *)plaintext, strlen(plaintext));
    ciphertext_len = len;

    // ????
    EVP_EncryptFinal_ex(ctx, ciphertext + len, &len);
    ciphertext_len += len;

    // ??
    EVP_CIPHER_CTX_free(ctx);

    printf("??????: ");
    for(int i = 0; i < ciphertext_len; i++) {
        printf("x", ciphertext[i]);
    }
    printf("\n");

    // ????????
    ctx = EVP_CIPHER_CTX_new();
    EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, (unsigned char *)key, (unsigned char *)iv);

    // ????
    EVP_DecryptUpdate(ctx, decryptedtext, &len, ciphertext, ciphertext_len);
    int decryptedtext_len = len;

    // ????
    EVP_DecryptFinal_ex(ctx, decryptedtext + len, &len);
    decryptedtext_len += len;

    // ??
    EVP_CIPHER_CTX_free(ctx);

    decryptedtext[decryptedtext_len] = '\0'; // ????????
    printf("??????: %s\n", decryptedtext);

    return 0;
}

????: ????????? OpenSSL ???,??????????:

gcc -o des3_example des3_example.c -lcrypto

????:

./des3_example

????:

??????: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
??????: Hello, World!

????:

  1. ????:3DES ?? 24 ??(192 ?)??????????,OpenSSL ??????????
  2. ???? (IV):CBC ?????? 8 ??? IV,???????????? IV ???????
  3. ????:OpenSSL ???? PKCS#5 ??,?????????

????????? OpenSSL ??

?? C ??,???????????? OpenSSL ???,? Python?Java?Ruby ????? Python ?? pycryptodome ??? 3DES ?????:

Python ??(?? pycryptodome)

??,?? pycryptodome ?:

pip install pycryptodome

??,?????????:

from Crypto.Cipher import DES3
from Crypto.Util.Padding import pad, unpad
import base64

key = b'123456781234567812345678'  # 24 ????
iv = b'12345678'                # 8 ?? IV

# ?? 3DES ???
cipher = DES3.new(key, DES3.MODE_CBC, iv)

# ????? 8 ?????,????
plaintext = b'Hello, World!'
padded_plaintext = pad(plaintext, DES3.block_size)

# ??
ciphertext = cipher.encrypt(padded_plaintext)

# ??? Base64
ciphertext_base64 = base64.b64encode(ciphertext)
print("??????:", ciphertext_base64.decode())

# ??
cipher_decrypt = DES3.new(key, DES3.MODE_CBC, iv)
decrypted_padded = cipher_decrypt.decrypt(ciphertext_base64.decode().encode())

# ????
decrypted = unpad(decrypted_padded, DES3.block_size)
print("??????:", decrypted.decode())

????:

??????: U2FsdGVkX1+vupppZksvRf5pq5Jz0=
??????: Hello, World!

????

?? OpenSSL ?? 3DES ????????????????,????????????????????????,??????????????,????????????

????????????,???? OpenSSL ????????????????????

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe412AzsNAAdQBFA.html

推荐文章

  • Linux下Rust的并发编程实践

    在Linux环境下,使用Rust进行并发编程可以充分利用其提供的零成本抽象和内存安全特性。以下是一些关键概念和实践示例:
    基础线程创建与数据共享 使用std::t...

  • Linux syslog如何监控系统性能

    Linux中的Syslog服务是一个强大的工具,用于集中管理和分析系统和网络设备生成的日志信息。通过Syslog,系统管理员可以监控系统性能,及时发现和解决潜在问题。以...

  • Linux中如何使用mount命令挂载ISO镜像

    在Linux中,使用mount命令挂载ISO镜像文件相对简单。以下是详细步骤: 创建一个挂载点:
    首先,你需要创建一个目录作为挂载点。例如,创建一个名为iso_moun...

  • Linux Syslog如何实现远程日志收集

    在Linux系统中,实现远程日志收集通常使用Syslog协议。以下是实现远程日志收集的步骤:
    1. 配置Syslog服务器
    首先,你需要一个Syslog服务器来接收来自...

  • centos php配置中的max_execution_time

    max_execution_time 是 PHP 配置文件(php.ini)中的一个设置项,用于控制脚本的最大执行时间。单位是秒。当脚本运行时间超过这个值时,PHP 会自动终止脚本的执行...

  • CentOS下如何优化网络设置

    在CentOS下优化网络设置可以通过多种方法实现,以下是一些基本的步骤和建议:
    配置静态IP地址 确定网络接口:使用 ip addr show命令查看可用的网络接口。

  • centos中php的并发处理能力如何提升

    在CentOS系统中提升PHP的并发处理能力可以通过多种方法实现。以下是一些有效的策略:
    使用多进程 pcntl扩展:利用pcntl_fork()函数创建子进程,实现并发处理...

  • Debian Strings性能优化技巧有哪些

    在Debian系统中,优化字符串性能的技巧主要涉及Java语言中的字符串操作。以下是一些关键的优化技巧:
    字符串拼接优化 使用StringBuilder:在需要大量字符串...