当前位置: 首页 >> 程序设计 >> S-DES算法的C++实现
 

S-DES算法的C++实现

作者:      来源:zz     发表时间:2007-02-02     浏览次数:      字号:    

 

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-1fk2(SW(fk1(IP(明文)))))                                                        其中       K1=P8(移位(P10(密钥K)))                                                                  

           K2=P8(移位(移位(P10(密钥K))))

解密算法的数学表示:  明文=IP-1fk1(SW(fk2(IP(密文)))))

 

 

10bit密钥

  解密

8bit明文

P10

8bit明文

IP

移位

IP-1

P8

fk

fk

SW

SW

移位

P8

fk

fk

IP

IP-1

8bit密文

8bit密文

K2

K2

K1

K1

  加密

10bit密钥

  解密

8bit明文

P10

8bit明文

IP

移位

IP-1

P8

fk

fk

SW

SW

移位

P8

fk

fk

IP

IP-1

8bit密文

8bit密文

K2

K2

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;