openssl实现des ecb加密

QByteArray  DES_ECB_encrypt(const QByteArray &key, const QByteArray &data)

{

    DES_cblock keyEncrypt;

    memset(keyEncrypt, 0, 8);

    memcpy(keyEncrypt, key.constData(), static_cast<size_t>(key.length()));

 

    // 密钥置换

    DES_key_schedule keySchedule;

    DES_set_key_unchecked(&keyEncrypt, &keySchedule);

 

    // 循环加密,每8字节一次

    const_DES_cblock inputText;

    DES_cblock outputText;

 

    QByteArray array;

 

    int data_len = data.length();

 

    for (int i = 0; i < data_len / 8; ++i)

    {

        memcpy(inputText, data.constData() + i * 8, 8);

        DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_ENCRYPT);

        for (int j = 0; j < 8; j++)

            array.push_back(static_cast<char>( outputText[j] ));

    }

 

    if (data_len % 8 != 0)

    {

        int tmp1 = data.length() / 8 * 8;

        int tmp2 = data.length() - tmp1;

        memset(inputText, 0, 8);

        memcpy(inputText, data.constData() + tmp1, static_cast<size_t>(tmp2) );

        // 加密函数

        DES_ecb_encrypt(&inputText, &outputText, &keySchedule, DES_ENCRYPT);

        for (int j = 0; j < 8; j++)

            array.push_back(static_cast<char>( outputText[j] ));

    }

    return array;

}

以下是使用openssl实现DES加密和解密的源码以及注释: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/des.h> // 引入openssl库中DES算法相关的头文件 #define BLOCK_SIZE 8 // 定义加密块的大小为8字节 // 将16进制字符串转换为字节数组 void hexStrToByte(const char* source, unsigned char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i += 2) { sscanf(source + i, "%2hhx", dest + i / 2); } } // 将字节数组转换为16进制字符串 void byteToHexStr(const unsigned char* source, char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i++) { sprintf(dest + i * 2, "%02x", source[i]); } } // 加密 void encrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的加密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 } } // 解密 void decrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的解密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 } } int main() { const char* keyStr = "01234567"; // 密钥 const char* inputStr = "Hello, DES!"; // 待加密的字符串 unsigned char key[BLOCK_SIZE] = {0}; hexStrToByte(keyStr, key, strlen(keyStr)); // 将16进制字符串转换为字节数组 unsigned char input[BLOCK_SIZE * 2] = {0}; strcpy((char*) input, inputStr); int inputLen = strlen(inputStr); int paddedLen = inputLen + (BLOCK_SIZE - inputLen % BLOCK_SIZE); // 计算填充后的长度 unsigned char* paddedInput = (unsigned char*) malloc(paddedLen + 1); memset(paddedInput, 0, paddedLen + 1); memcpy(paddedInput, input, inputLen); // 将待加密的字符串拷贝到填充后的字符串中 unsigned char* output = (unsigned char*) malloc(paddedLen + 1); memset(output, 0, paddedLen + 1); encrypt(key, paddedInput, output); // 加密 char* outputHexStr = (char*) malloc(2 * paddedLen + 1); byteToHexStr(output, outputHexStr, paddedLen); // 将加密后的字节数组转换为16进制字符串 printf("Encrypted: %s\n", outputHexStr); memset(paddedInput, 0, paddedLen + 1); decrypt(key, output, paddedInput); // 解密 printf("Decrypted: %s\n", paddedInput); free(paddedInput); free(output); free(outputHexStr); return 0; } ``` 注释详解如下: 1. 引入openssl库中DES算法相关的头文件 ```c #include <openssl/des.h> ``` 2. 定义加密块的大小为8字节 ```c #define BLOCK_SIZE 8 ``` 3. 将16进制字符串转换为字节数组 ```c void hexStrToByte(const char* source, unsigned char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i += 2) { sscanf(source + i, "%2hhx", dest + i / 2); } } ``` 4. 将字节数组转换为16进制字符串 ```c void byteToHexStr(const unsigned char* source, char* dest, int sourceLen) { int i; for (i = 0; i < sourceLen; i++) { sprintf(dest + i * 2, "%02x", source[i]); } } ``` 5. 加密 ```c void encrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的加密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_ENCRYPT); // DES加密 } } ``` 6. 解密 ```c void decrypt(const unsigned char* key, const unsigned char* input, unsigned char* output) { DES_key_schedule ks; // DES密钥调度结构体 DES_set_key_unchecked((const_DES_cblock*) key, &ks); // 将密钥转换为DES密钥调度结构体 unsigned char* inputPtr = (unsigned char*) input; unsigned char* outputPtr = output; int remainingBytes = strlen((const char*) input); while (remainingBytes >= BLOCK_SIZE) { DES_ecb_encrypt((const_DES_cblock*) inputPtr, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 inputPtr += BLOCK_SIZE; outputPtr += BLOCK_SIZE; remainingBytes -= BLOCK_SIZE; } if (remainingBytes > 0) { unsigned char paddedInput[BLOCK_SIZE] = {0}; // 填充后的解密块 memcpy(paddedInput, inputPtr, remainingBytes); DES_ecb_encrypt((const_DES_cblock*) paddedInput, (DES_cblock*) outputPtr, &ks, DES_DECRYPT); // DES解密 } } ``` 7. 主函数:生成密钥、待加密的字符串,进行加密和解密,输出结果 ```c int main() { const char* keyStr = "01234567"; // 密钥 const char* inputStr = "Hello, DES!"; // 待加密的字符串 unsigned char key[BLOCK_SIZE] = {0}; hexStrToByte(keyStr, key, strlen(keyStr)); // 将16进制字符串转换为字节数组 unsigned char input[BLOCK_SIZE * 2] = {0}; strcpy((char*) input, inputStr); int inputLen = strlen(inputStr); int paddedLen = inputLen + (BLOCK_SIZE - inputLen % BLOCK_SIZE); // 计算填充后的长度 unsigned char* paddedInput = (unsigned char*) malloc(paddedLen + 1); memset(paddedInput, 0, paddedLen + 1); memcpy(paddedInput, input, inputLen); // 将待加密的字符串拷贝到填充后的字符串中 unsigned char* output = (unsigned char*) malloc(paddedLen + 1); memset(output, 0, paddedLen + 1); encrypt(key, paddedInput, output); // 加密 char* outputHexStr = (char*) malloc(2 * paddedLen + 1); byteToHexStr(output, outputHexStr, paddedLen); // 将加密后的字节数组转换为16进制字符串 printf("Encrypted: %s\n", outputHexStr); memset(paddedInput, 0, paddedLen + 1); decrypt(key, output, paddedInput); // 解密 printf("Decrypted: %s\n", paddedInput); free(paddedInput); free(output); free(outputHexStr); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值