S-DES算法的实现
介绍
加密算法涉及五个函数:
(1) 初始置换IP (initial permutation)
(2) 复合函数fk1,它是由子密钥K1确定的,混合了代换和置换的运算。
(3) 交换函数SW (Switch)
(4) 复合函数fk2 ,由子密钥K2确定
(5) 初始置换IP的逆置换IP-1
加密算法的数学表示: IP-1*fk2*SW*fk1*IP
也可写为 密文=IP-1(fk2(SW(fk1(IP(明文))))) 其中 K1=P8(移位(P10(密钥K)))
K2=P8(移位(移位(P10(密钥K))))
解密算法的数学表示: 明文=IP-1(fk1(SW(fk2(IP(密文)))))
10bit密钥 解密 8bit明文 P10 8bit明文 IP 移位 IP-1 P8 fk fk SW SW 移位 P8 fk fk IP IP-1 8bit密文 8bit密文 K1 K1 加密 10bit密钥 解密 8bit明文 P10 8bit明文 IP 移位 IP-1 P8 fk fk SW SW 移位 P8 fk fk IP IP-1 8bit密文 8bit密文 K1 K1 加密
以下是用C++写的源码
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
const int KEY = 10; //密钥长度
const int HALF_KEY = 5; //密钥长度的一半
const int SUB_KEY = 8; //子密钥长度
const int TEXT = 8; //明文或密文的长度
const int HALF_TEXT = 4; //明文或密文长度的一半
const int QUARTER_TEXT = 2; //明文或密文长度的四分之一
const string P10 = "2416390875"; //置换密钥的字符串
const string P8 = "52637498"; //从位的密钥中抽取位组成子密钥的置换字符串
const string IP = "15203746"; //置换明文的字符串
const string IP_1 = "30246175"; //逆置换明文的字符串
const string EP = "30121230"; //扩展置换的字符串
const int S0[4][4] = //S0 Box
{
{1, 0, 3, 2},
{3, 2, 1, 0},
{0, 2, 1, 3},
{3, 1, 3, 2}
};
const int S1[4][4] = //S1 Box
{
{0, 1, 2, 3},
{2, 0, 1, 3},
{3, 0, 1, 0},
{2, 1, 0, 3}
};
class SDES
{
public:
//构造函数
SDES(const char* password)
{
key = bitset<KEY>(password);
k1 = CreateK1(key);
k2 = CreateK2(key);
}
SDES(string password)
{
key = bitset<KEY>(password);
k1 = CreateK1(key);
k2 = CreateK2(key);
}
//加密
bitset<TEXT> Encrypt(bitset<TEXT> src)
{
bitset<TEXT> ipText = ExchangeTextPos(src, IP);
bitset<HALF_TEXT> leftText = GetTextLeft(ipText);
bitset<HALF_TEXT> rightText = GetTextRight(ipText);
bitset<HALF_TEXT> boxOutput, rsOutput;
boxOutput = EncryptBox(leftText, rightText, k1);
rsOutput = EncryptBox(rightText, boxOutput, k2);
bitset<TEXT> ip_1Text = FormText(rsOutput, boxOutput);
return ExchangeTextPos(ip_1Text, IP_1);
}
//加密
bitset<TEXT> Encrypt(string src)
{
return Encrypt(bitset<TEXT>(src));
}
//解密
bitset<TEXT> Decrypt(bitset<TEXT> src)
{
bitset<TEXT> ipText = ExchangeTextPos(src, IP);
bitset<HALF_TEXT> leftText = GetTextLeft(ipText);
bitset<HALF_TEXT> rightText = GetTextRight(ipText);
bitset<HALF_TEXT> boxOutput, rsOutput;
boxOutput = EncryptBox(leftText, rightText, k2);
rsOutput = EncryptBox(rightText, boxOutput, k1);
bitset<TEXT> ip_1Text = FormText(rsOutput, boxOutput);
return ExchangeTextPos(ip_1Text, IP_1);
}
//解密
bitset<TEXT> Decrypt(string src)
{
return Decrypt(bitset<TEXT>(src));
}
private:
bitset<KEY> key; //密钥
bitset<SUB_KEY> k1; //子密钥K1
bitset<SUB_KEY> k2; //子密钥K2
//根据参数newPos改变密钥各位的位置
bitset<KEY> ExchangeKeyPos(bitset<KEY> src, string newPos)
{
bitset<KEY> rs;
int i;
for (i = 0; i < KEY; i++)
{
rs.at(KEY - 1 - i) = src.at(KEY -1 - newPos[i] + '0');
}
return rs;
}
//根据参数newPos改变明文各位的位置
bitset<TEXT> ExchangeTextPos(bitset<TEXT> src, string newPos)
{
bitset<TEXT> rs;
int i;









