📄 des.cpp
字号:
#include <iostream.h>
#include "deshead.h"
#include "fstream.h"
#include "string.h"
#include "malloc.h"
#include "stdio.h"
#include <math.h>
des::GetTxt()//从"明文.dat"中读取字符数据,放到字符数组里,判断完后进行分组;
{
char ch;
int i=0;
ifstream fin;
ofstream fout;
mingwen.totalchar=0;
fin.open("明文.dat");
while (fin.get(ch))
{
mingwen.totalchar++;
mingwen.dat[i]=ch;
i=i+1;
}
fin.close();
fout.open("明文字符总数为.dat");
fout<<mingwen.totalchar;
fout.close();
}
des::chartobits(chars ch,bits *bts)
{
int cnt1,cnt2,pos;
for (cnt1=0;cnt1<ch.totalchar;cnt1++)
{
pos=int(ch.ch[cnt1]);
pos=pos<0?pos+256:pos;
pos=pos+28;
for (cnt2=7;cnt2>=0;cnt2--)
{
bts->bit[cnt1*ch.totalchar+cnt2]=(pos%2!=0)?true:false;
pos/=2;
}
}
bts->totalbit=ch.totalchar*8;
}
des::bitstochar(bits bts,chars *ch)
{
int cnt1,cnt2,pos,power;
for (cnt1=0;cnt1<8;cnt1++)
{
pos=0;
power=128;
for (cnt2=0;cnt2<8;cnt2++)
{
if (bts.bit[cnt1*8+cnt2])
pos+=power;
power/=2;
}
ch->ch[cnt1]=char(pos-28);
}
ch->totalchar=bts.totalbit/8;
}
des::bitmaping(int bitmapno,bits inbits,bits *outbits)
{
int cnt,mapsize;
switch(bitmapno) {
case 1:mapsize=64; break;
case 2:mapsize=64; break;
case 3:mapsize=48; break;
case 4:mapsize=32; break;
case 5:mapsize=56; break;
case 6:mapsize=48; break;
}
outbits->totalbit=mapsize;
for (cnt=0;cnt<mapsize;cnt++)
{
switch(bitmapno) {
case 1:outbits->bit[cnt]=inbits.bit[ip[cnt]-1]; break;
case 2:outbits->bit[cnt]=inbits.bit[fp[cnt]-1]; break;
case 3:outbits->bit[cnt]=inbits.bit[e[cnt]-1]; break;
case 4:outbits->bit[cnt]=inbits.bit[p[cnt]-1]; break;
case 5:outbits->bit[cnt]=inbits.bit[pc1[cnt]-1]; break;
case 6:outbits->bit[cnt]=inbits.bit[pc2[cnt]-1]; break;
}
}
}
des::init_IP(bits bts64,bits * lbts32,bits * rbts32)
{
int cnt;
bits tempbts;
bitmaping(1,bts64,&tempbts);
for (cnt=0;cnt<32;cnt++) {
lbts32->bit[cnt]=tempbts.bit[cnt];
rbts32->bit[cnt]=tempbts.bit[cnt+32];
}
lbts32->totalbit=32;
rbts32->totalbit=32;
}
des::finall_IP(bits lbts32,bits rbts32,bits *bts64)
{
int cnt;
bits tempbts;
for (cnt=0;cnt<32;cnt++) {
tempbts.bit[cnt]=lbts32.bit[cnt];
tempbts.bit[cnt+32]=rbts32.bit[cnt];
}
tempbts.totalbit=64;
bitmaping(2,tempbts,bts64);
}
des::leftshift(bits *bit28,int times)
{
bool lastbit;
int cnt1,cnt2;
for (cnt1=0;cnt1<times;cnt1++) {
lastbit=bit28->bit[0];
for (cnt2=0;cnt2<bit28->totalbit-1;cnt2++)
bit28->bit[cnt2]=bit28->bit[cnt2+1];
bit28->bit[bit28->totalbit-1]=lastbit;
}
}
des::PC1_tran(bits bts64,bits *cbts28,bits *dbts28)
{
int cnt;
bits tempbts;
bitmaping(5,bts64,&tempbts);
for (cnt=0;cnt<28;cnt++) {
cbts28->bit[cnt]=tempbts.bit[cnt];
dbts28->bit[cnt]=tempbts.bit[cnt];
}
cbts28->totalbit=28;
dbts28->totalbit=28;
}
des::PC2_tran(bits cbts28,bits dbts28,bits *kbts48){
int cnt;
bits tempbts;
for (cnt=0;cnt<28;cnt++) {
tempbts.bit[cnt]=cbts28.bit[cnt];
tempbts.bit[cnt+28]=dbts28.bit[cnt];
}
tempbts.totalbit=56;
bitmaping(6,tempbts,kbts48);
}
des::keygen(bits key,bitarry *subkey)
{
bits cbts28,dbts28,kbts48;
int cnt;
PC1_tran(key,&cbts28,&dbts28);
for (cnt=0;cnt<16;cnt++) {
leftshift(&cbts28,ls[cnt]);
leftshift(&dbts28,ls[cnt]);
PC2_tran(cbts28,dbts28,&kbts48);
subkey->bitarr[cnt]=kbts48;
}
}
des::E_tran(bits bts32,bits*bts48){
bitmaping(3,bts32,bts48);
}
des::bitToSboxpos(bits bts48,int boxno,int *row,int *col)
{
* row=(bts48.bit[boxno*6]?2:0)+(bts48.bit[boxno*6+5]?1:0);
* col=(bts48.bit[boxno*6+1]?8:0)+(bts48.bit[boxno*6+2]?4:0)+(bts48.bit[boxno*6]?2:0)+(bts48.bit[boxno*6+4]?1:0);
}
des::sbox_tran(bits bts48,bits *bts32)
{
int cnt1,cnt2,row,col,boxout;
for (cnt1=0;cnt1<8;cnt1++) {
bitToSboxpos(bts48,cnt1,&row,&col);
boxout=sbox[cnt1][row*16+col];
for (cnt2=3;cnt2>=0;cnt2--) {
bts32->bit[cnt1*4+cnt2]=(boxout%2!=0)?true:false;
boxout/=2;
}
}
bts32->totalbit=32;
}
des::P_tran(bits bts32,bits *fout)
{
bitmaping(4,bts32,fout);
}
des::F_tran(bits inbts32,bits keyi,bits *fres)
{
bits bts48,bts32,xorres48;
E_tran(inbts32,&bts48);
exclusiveOR(bts48,keyi,&xorres48);
sbox_tran(xorres48,&bts32);
P_tran(bts32,fres);
}
des::exclusiveOR(bits bts1,bits bts2,bits *xorRes)
{
int cnt;
xorRes->totalbit=bts1.totalbit;
for (cnt=0;cnt<bts1.totalbit;cnt++)
xorRes->bit[cnt]=bts1.bit[cnt]^bts2.bit[cnt];
}
des::desblock(chars intext8,chars key,bool encode,chars *outtext8)
{
int cnt,keypos;
bits inbts,lbts,rbts,oldlbts;
bits keybit,outbts,fres;
bitarry subkey;
chartobits(intext8,&inbts);
chartobits(key,&keybit);
keygen(keybit,&subkey);
init_IP(inbts,&lbts,&rbts);
for (cnt=0;cnt<16;cnt++) {
oldlbts=lbts;
lbts=rbts;
keypos=encode?cnt:(15-cnt);
F_tran(rbts,subkey.bitarr[keypos],&fres);
exclusiveOR(oldlbts,fres,&rbts);
}
finall_IP(rbts,lbts,&outbts);
bitstochar(outbts,outtext8);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -