在VC++中用代码完成以下要求:自己编写des子密钥的生成算法,并根据自己设定的种子密钥运行程序产生并显示出16轮的子密钥,用des算法对输入的十六进制加密,比较输入和输出,当改变一个位时比较输出的变化,并说明原因。
时间: 2024-02-19 20:02:28 浏览: 21
为了编写自己的DES子密钥生成算法,您需要了解DES算法的基本原理和流程。下面是一个简单的步骤列表:
1. 初始化,包括IP置换和将64位输入分成左半块和右半块。
2. 连续进行16轮加密,每轮的操作包括扩展置换、异或运算、S盒替换、P置换和交换左右块。
3. 最后进行逆置换得到最终的输出。
下面是一个自己编写的DES子密钥生成算法的示例代码:
```c++
#include <iostream>
#include <bitset>
#define C 28
#define D 28
#define PC1 56
#define PC2 48
#define ROTATE 16
using namespace std;
int PC1_Table[PC1] = { 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, 13, 5, 28, 20, 12, 4 };
int PC2_Table[PC2] = { 14, 17, 11, 24, 1, 5,
3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8,
16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55,
30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53,
46, 42, 50, 36, 29, 32 };
int SHIFT_Table[ROTATE] = { 1, 1, 2, 2, 2, 2, 2, 2,
1, 2, 2, 2, 2, 2, 2, 1 };
bitset<PC1> getPermutedKey(bitset<64> key) {
bitset<PC1> permutedKey;
for (int i = 0; i < PC1; i++) {
permutedKey.set(PC1_Table[i] - 1, key.test(64 - PC1_Table[i]));
}
return permutedKey;
}
bitset<C> getLeftShifted(bitset<C> C, int round) {
bitset<C> leftShifted;
int shiftNum = SHIFT_Table[round - 1];
for (int i = 0; i < C; i++) {
if (i + shiftNum < C) {
leftShifted.set(i, C.test(i + shiftNum));
}
else {
leftShifted.set(i, C.test((i + shiftNum) % C));
}
}
return leftShifted;
}
bitset<D> getRightShifted(bitset<D> D, int round) {
bitset<D> rightShifted;
int shiftNum = SHIFT_Table[round - 1];
for (int i = 0; i < D; i++) {
if (i + shiftNum < D) {
rightShifted.set(i, D.test(i + shiftNum));
}
else {
rightShifted.set(i, D.test((i + shiftNum) % D));
}
}
return rightShifted;
}
bitset<PC2> getPermutedKey2(bitset<C> C, bitset<D> D) {
bitset<PC2> permutedKey2;
for (int i = 0; i < PC2; i++) {
if (i < C) {
permutedKey2.set(i, C.test(C - i - 1));
}
else {
permutedKey2.set(i, D.test(D - (i - C) - 1));
}
}
return permutedKey2;
}
int main()
{
bitset<64> key("0000000100100011010001010110011110001001101010111100110111101111");
bitset<PC1> permutedKey = getPermutedKey(key);
bitset<C> C(0), D(0);
for (int i = 0; i < C; i++) {
C.set(i, permutedKey.test(PC1 - i - 1));
}
for (int i = 0; i < D; i++) {
D.set(i, permutedKey.test(PC1 - C - i - 1));
}
for (int round = 1; round <= ROTATE; round++) {
bitset<C> leftShifted = getLeftShifted(C, round);
bitset<D> rightShifted = getRightShifted(D, round);
C = leftShifted;
D = rightShifted;
bitset<PC2> permutedKey2 = getPermutedKey2(C, D);
cout << "Round " << round << " Key: " << permutedKey2.to_string() << endl;
}
return 0;
}
```
此代码将生成16轮子密钥并将其输出到控制台中。
要使用这些子密钥加密输入的16进制数据,可以使用OpenSSL库提供的加密函数。以下是一个简单的示例程序:
```c++
#include <iostream>
#include <string>
#include <openssl/des.h>
using namespace std;
int main()
{
const unsigned char input[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };
const unsigned char key[] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
unsigned char output[8];
DES_key_schedule schedule;
DES_set_key((DES_cblock*)key, &schedule);
DES_ecb_encrypt((DES_cblock*)input, (DES_cblock*)output, &schedule, DES_ENCRYPT);
cout << "Input: ";
for (int i = 0; i < 8; i++) {
printf("%02X ", input[i]);
}
cout << endl;
cout << "Output: ";
for (int i = 0; i < 8; i++) {
printf("%02X ", output[i]);
}
cout << endl;
input[0] = 0x01;
DES_ecb_encrypt((DES_cblock*)input, (DES_cblock*)output, &schedule, DES_ENCRYPT);
cout << "Changed Input: ";
for (int i = 0; i < 8; i++) {
printf("%02X ", input[i]);
}
cout << endl;
cout << "Changed Output: ";
for (int i = 0; i < 8; i++) {
printf("%02X ", output[i]);
}
cout << endl;
return 0;
}
```
此代码将使用OpenSSL库中的DES算法加密输入数据,并比较更改一个位后的输出结果。输出结果将显示在控制台中。
请注意,此代码仅仅是一个简单的示例,并且使用了OpenSSL库。在实际生产环境中,您需要确保使用的加密算法是安全的,并且实现方式是正确的。