DES加密解密(C++实现)

这是我们信安协会很早布置的作业,前几天终于写完了,嘿嘿O(∩_∩)O~


其实DES加密很简单,流程如下


1.对64位明文进行初置换,结果为A

2.将A分为两部分,左32位记为L,右32位记为R

3.对R进行拓展置换,得到X(48位)

4.将第I轮的密钥与X异或,得到Y(48位)

5.将Y穿入S盒,得到Z(32位)

6.将Z与L异或,结果传入L中

7.交换R和L

8.再次重复2~7,共计16次

9.将L和R整合,并将结果做末置换,加密完成


解密的流程其实是一样的额,只不过密钥不一样

假设加密时第i轮用的密钥Ki,那么解密时第i轮用的密钥是K(17-i)


下面说一下密钥生成的过程:


首先,我们一开始输入的密钥为X(64位)

1.将密钥X做密钥置换,取出其中58位记为T(58位)

2.取T左边28位为L,T右边28位为R

3.分别对R,L作循环左移

4.再对其做扩展运算,得到K[i]

6.重复3~4,共16次


这样大概也就说清楚了


#include<stdio.h>
#include<iostream>
#include<string.h>

#define BIT bool

using namespace std;

BIT K[16][48];

int 
    //初置换 
    IP[64] = {
    58 , 50 , 42 , 34 , 26 , 18 , 10 ,  2 ,
    60 , 52 , 44 , 36 , 28 , 20 , 12 ,  4 ,
    62 , 54 , 46 , 38 , 30 , 22 , 14 ,  6 ,
    64 , 56 , 48 , 40 , 32 , 24 , 16 ,  8 ,
    57 , 49 , 41 , 33 , 25 , 17 ,  9 ,  1 ,
    59 , 51 , 43 , 35 , 27 , 19 , 11 ,  3 ,
    61 , 53 , 45 , 37 , 29 , 21 , 13 ,  5 ,
    63 , 55 , 47 , 39 , 31 , 23 , 15 ,  7},
    //末置换 
    FP[64] = {
    40 ,  8 , 48 , 16 , 56 , 24 , 64 , 32 ,
    39 ,  7 , 47 , 15 , 55 , 23 , 63 , 31 ,
    38 ,  6 , 46 , 14 , 54 , 22 , 62 , 30 ,
    37 ,  5 , 45 , 13 , 53 , 21 , 61 , 29 ,
    36 ,  4 , 44 , 12 , 52 , 20 , 60 , 28 ,
    35 ,  3 , 43 , 11 , 51 , 19 , 59 , 27 ,
    34 ,  2 , 42 , 10 , 50 , 18 , 58 , 26 ,
    33 ,  1 , 41 ,  9 , 49 , 17 , 57 , 25},
    //密钥置换 
    KP[56] = {
    57 , 49 , 41 , 33 , 25 , 17 ,  9 ,  1 , 
    58 , 50 , 42 , 34 , 26 , 18 , 10 ,  2 ,
    59 , 51 , 43 , 35 , 27 , 19 , 11 ,  3 ,
    60 , 52 , 44 , 36 , 63 , 55 , 47 , 39 ,
    31 , 23 , 15 ,  7 , 62 , 54 , 46 , 38 ,
    30 , 22 , 14 ,  6 , 61 , 53 , 45 , 37 ,
    29 , 21 
  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
以下是使用C语言进行3DES加密解密的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/des.h> #define KEY "123456789012345678901234" // 24字节密钥 #define IV "12345678" // 8字节初始向量 // 3DES加密 int des3_encrypt(unsigned char *input, int input_len, unsigned char *output, int *output_len) { DES_cblock key1, key2, key3, iv; DES_key_schedule ks1, ks2, ks3; int len = 0, padding = 0; memset(key1, 0, sizeof(key1)); memset(key2, 0, sizeof(key2)); memset(key3, 0, sizeof(key3)); memset(iv, 0, sizeof(iv)); memcpy(key1, KEY, 8); memcpy(key2, KEY+8, 8); memcpy(key3, KEY+16, 8); memcpy(iv, IV, 8); DES_set_key(&key1, &ks1); DES_set_key(&key2, &ks2); DES_set_key(&key3, &ks3); // 计算填充字节 padding = 8 - input_len % 8; len = input_len + padding; // 填充 unsigned char *padding_input = (unsigned char *)malloc(len); memcpy(padding_input, input, input_len); memset(padding_input+input_len, padding, padding); // 加密 unsigned char *tmp_output = (unsigned char *)malloc(len); DES_ede3_cbc_encrypt(padding_input, tmp_output, len, &ks1, &ks2, &ks3, &iv, DES_ENCRYPT); memcpy(output, tmp_output, len); *output_len = len; free(padding_input); free(tmp_output); return 0; } // 3DES解密 int des3_decrypt(unsigned char *input, int input_len, unsigned char *output, int *output_len) { DES_cblock key1, key2, key3, iv; DES_key_schedule ks1, ks2, ks3; int len = 0, padding = 0; memset(key1, 0, sizeof(key1)); memset(key2, 0, sizeof(key2)); memset(key3, 0, sizeof(key3)); memset(iv, 0, sizeof(iv)); memcpy(key1, KEY, 8); memcpy(key2, KEY+8, 8); memcpy(key3, KEY+16, 8); memcpy(iv, IV, 8); DES_set_key(&key1, &ks1); DES_set_key(&key2, &ks2); DES_set_key(&key3, &ks3); // 解密 unsigned char *tmp_output = (unsigned char *)malloc(input_len); DES_ede3_cbc_encrypt(input, tmp_output, input_len, &ks1, &ks2, &ks3, &iv, DES_DECRYPT); // 去掉填充字节 padding = tmp_output[input_len-1]; len = input_len - padding; memcpy(output, tmp_output, len); *output_len = len; free(tmp_output); return 0; } int main() { unsigned char input[] = "Hello world!"; unsigned char encrypt_output[128] = {0}; unsigned char decrypt_output[128] = {0}; int encrypt_output_len = 0; int decrypt_output_len = 0; // 加密 des3_encrypt(input, strlen(input), encrypt_output, &encrypt_output_len); printf("encrypt_output: %s\n", encrypt_output); // 解密 des3_decrypt(encrypt_output, encrypt_output_len, decrypt_output, &decrypt_output_len); printf("decrypt_output: %s\n", decrypt_output); return 0; } ``` 该示例代码使用了OpenSSL库中的DES函数。首先定义了24字节的密钥和8字节的初始向量,然后使用DES_set_key函数设置3个密钥和初始向量。接下来计算填充字节,使用DES_ede3_cbc_encrypt函数进行加密加密后再去掉填充字节。解密过程与加密相似,使用DES_ede3_cbc_encrypt函数进行解密解密后再去掉填充字节。最后使用main函数测试了加密解密的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值