本文介绍了一种国际上通用的加密算法—DES算法的原理,并给出了在VC++6.0语言环境下实现的源代码。最后给出一个示例,以供参考。
关键字:DES算法、明文、密文、密钥、VC;
本文程序运行效果图如下:
正文:
当今社会是信息化的社会。为了适应社会对计算机数据安全保密越来越高的要求,美国国家标准局(NBS)于1997年公布了一个由IBM公司研制的一种加密算法,并且确定为非机要部门使用的数据加密标准,简称DES(Data Encrypton Standard)。自公布之日起,DES算法作为国际上商用保密通信和计算机通信的最常用算法,一直活跃在国际保密通信的舞台上,扮演了十分突出的角色。现将DES算法简单介绍一下,并给出实现DES算法的VC源代码。
DES算法由加密、解密和子密钥的生成三部分组成。
一.加密
DES算法处理的数据对象是一组64比特的明文串。设该明文串为m=m1m2…m64 (mi=0或1)。明文串经过64比特的密钥K来加密,最后生成长度为64比特的密文E。其加密过程图示如下:
DES算法加密过程
对DES算法加密过程图示的说明如下:待加密的64比特明文串m,经过IP置换后,得到的比特串的下标列表如下:
IP 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
该比特串被分为32位的L0和32位的R0两部分。R0子密钥K1(子密钥的生成将在后面讲)经过变换f(R0,K1)(f变换将在下面讲)输出32位的比特串f1,f1与L0做不进位的二进制加法运算。运算规则为:
f1与L0做不进位的二进制加法运算后的结果赋给R1,R0则原封不动的赋给L1。L1与R0又做与以上完全相同的运算,生成L2,R2…… 一共经过16次运算。最后生成R16和L16。其中R16为L15与f(R15,K16)做不进位二进制加法运算的结果,L16是R15的直接赋值。
R16与L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16与L16合并后成的比特串,经过置换IP-1后所得比特串的下标列表如下:
IP-1 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
经过置换IP-1后生成的比特串就是密文e.。
下面再讲一下变换f(Ri-1,Ki)。
它的功能是将32比特的输入再转化为32比特的输出。其过程如图所示:
对f变换说明如下:输入Ri-1(32比特)经过变换E后,膨胀为48比特。膨胀后的比特串的下标列表如下:
E: 32 1 2 3 4 5
4 5 6 7 8 9
8 9 10 11 12 13
12 13 14 15 16 17
16 17 18 19 20 21
20 21 22 23 24 25
24 25 26 27 28 29
28 29 30 31 32 31
膨胀后的比特串分为8组,每组6比特。各组经过各自的S盒后,又变为4比特(具体过程见后),合并后又成为32比特。该32比特经过P变换后,其下标列表如下:
P: 16 7 20 21
29 12 28 17
1 15 23 26
5 18 31 10
2 8 24 14
32 27 3 9
19 13 30 6
22 11 4 25
经过P变换后输出的比特串才是32比特的f (Ri-1,Ki)。
下面再讲一下S盒的变换过程。任取一S盒。见图:
在其输入b1,b2,b3,b4,b5,b6中,计算出x=b1*2+b6, y=b5+b4*2+b3*4+b2*8,再从Si表中查出x 行,y 列的值Sxy。将Sxy化为二进制,即得Si盒的输出。(S表如图所示)
至此,DES算法加密原理讲完了。在VC++6.0下的程序源代码为:
for(i=1;i<=64;i++)
m1[i]=m[ip[i-1]];//64位明文串输入,经过IP置换。
下面进行迭代。由于各次迭代的方法相同只是输入输出不同,因此只给出其中一次。以第八次为例://进行第八次迭代。首先进行S盒的运算,输入32位比特串。
for(i=1;i<=48;i++)//经过E变换扩充,由32位变为48位
RE1[i]=R7[E[i-1]];
for(i=1;i<=48;i++)//与K8按位作不进位加法运算
RE1[i]=RE1[i]+K8[i];
for(i=1;i<=48;i++)
{
if(RE1[i]==2)
RE1[i]=0;
}
for(i=1;i<7;i++)//48位分成8组
{
s11[i]=RE1[i];
s21[i]=RE1[i+6];
s31[i]=RE1[i+12];
s41[i]=RE1[i+18];
s51[i]=RE1[i+24];
s61[i]=RE1[i+30];
s71[i]=RE1[i+36];
s81[i]=RE1[i+42];
}//下面经过S盒,得到8个数。S1,s2,s3,s4,s5,s6,s7,s8分别为S表
s[1]=s1[s11[6]+s11[1]*2][s11[5]+s11[4]*2+s11[3]*4+s11[2]*8];
s[2]=s2[s21[6]+s21[1]*2][s21[5]+s21[4]*2+s21[3]*4+s21[2]*8];
s[3]=s3[s31[6]+s31[1]*2][s31[5]+s31[4]*2+s31[3]*4+s31[2]*8];
s[4]=s4[s41[6]+s41[1]*2][s41[5]+s41[4]*2+s41[3]*4+s41[2]*8];
s[5]=s5[s51[6]+s51[1]*2][s51[5]+s51[4]*2+s51[3]*4+s51[2]*8];
s[6]=s6[s61[6]+s61[1]*2][s61[5]+s61[4]*2+s61[3]*4+s61[2]*8];
s[7]=s7[s71[6]+s71[1]*2][s71[5]+s71[4]*2+s71[3]*4+s71[2]*8];
s[8]=s8[s81[6]+s81[1]*2][s81[5]+s81[4]*2+s81[3]*4+s81[2]*8];
for(i=0;i<8;i++)//8个数变换输出二进制
{
for(j=1;j<5;j++)
{
temp[j]=s[i+1]%2;
s[i+1]=s[i+1]/2;
}
for(j=1;j<5;j++)
f[4*i+j]=temp[5-j];
}
for(i=1;i<33;i++)//经过P变换
frk[i]=f[P[i-1]];//S盒运算完成
for(i=1;i<33;i++)//左右交换
L8[i]=R7[i];
for(i=1;i<33;i++)//R8为L7与f(R,K)进行不进位二进制加法运算结果
{
R8[i]=L7[i]+frk[i];
if(R8[i]==2)
R8[i]=0;
}
[ 原创文档 本文适合中级读者 已阅读21783次 ] 文档 代码 工具
DES算法及其在VC++6.0下的实现(下)
作者:航天医学工程研究所四室 朱彦军
在《DES算法及其在VC++6.0下的实现(上)》中主要介绍了DES算法的基本原理,下面让我们继续:
二.子密钥的生成
64比特的密钥生成16个48比特的子密钥。其生成过程见图:
子密钥生成过程具体解释如下:
64比特的密钥K,经过PC-1后,生成56比特的串。其下标如表所示:
PC-1 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
该比特串分为长度相等的比特串C0和D0。然后C0和D0分别循环左移1位,得到C1和D1。C1和D1合并起来生成C1D1。C1D1经过PC-2变换后即生成48比特的K1。K1的下标列表为:
PC-2 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
C1、D1分别循环左移LS2位,再合并,经过PC-2,生成子密钥K2……依次类推直至生成子密钥K16。
注意:Lsi (I =1,2,….16)的数值是不同的。具体见下表:
迭代顺序 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
左移位数 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
生成子密钥的VC程序源代码如下:
for(i=1;i<57;i++)//输入64位K,经过PC-1变为56位 k0[i]=k[PC_1[i-1]];
56位的K0,均分为28位的C0,D0。C0,D0生成K1和C1,D1。以下几次迭代方法相同,仅以生成K8为例。 for(i=1;i<27;i++)//循环左移两位
{
C8[i]=C7[i+2];
D8[i]=D7[i+2];
}
C8[27]=C7[1];
D8[27]=D7[1];
C8[28]=C7[2];
D8[28]=D7[2];
for(i=1;i<=28;i++)
{
C[i]=C8[i];
C[i+28]=D8[i];
}
for(i=1;i<=48;i++)
K8[i]=C[PC_2[i-1]];//生成子密钥k8
注意:生成的子密钥不同,所需循环左移的位数也不同。源程序中以生成子密钥 K8为例,所以循环左移了两位。但在编程中,生成不同的子密钥应以Lsi表为准。
三.解密
DES的解密过程和DES的加密过程完全类似,只不过将16圈的子密钥序列K1,K2……K16的顺序倒过来。即第一圈用第16个子密钥K16,第二圈用K15,其余类推。
第一圈:
加密后的结果
L=R15, R=L15⊕f(R15,K16)⊕f(R15,K16)=L15
同理R15=L14⊕f(R14,K15), L15=R14。
同理类推:
得 L=R0, R=L0。
其程序源代码与加密相同。在此就不重写。
四.示例
例如:已知明文m=learning, 密钥 k=computer。
明文m的ASCII二进制表示:
m= 01101100 01100101 01100001 01110010
01101110 01101001 01101110 01100111
密钥k的ASCII二进制表示:
k=01100011 01101111 01101101 01110000
01110101 01110100 01100101 01110010
明文m经过IP置换后,得:
11111111 00001000 11010011 10100110 00000000 11111111 01110001 11011000
等分为左右两段:
L0=11111111 00001000 11010011 10100110 R0=00000000 11111111 01110001 11011000
经过16次迭代后,所得结果为:
L1=00000000 11111111 01110001 11011000 R1=00110101 00110001 00111011 10100101
L2=00110101 00110001 00111011 10100101 R2=00010111 11100010 10111010 10000111
L3=00010111 11100010 10111010 10000111 R3=00111110 10110001 00001011 10000100
L4= R4=
L5= R5=
L6= R6=
L7= R7=
L8= R8=
L9= R9=
L10= R10=
L11= R11=
L12= R12=
L13= R13=
L14= R14=
L15= R15=
L16= R16=
其中,f函数的结果为:
f1= f2=
f3= f4=
f5= f6=
f7= f8=
f9= f10=
f11= f12=
f13= f14=
f15= f16=
16个子密钥为:
K1= K2=
K3= K4=
K5= K6=
K7= K8=
K9= K10=
K11= K12=
K13= K14=
K15= K16=
S盒中,16次运算时,每次的8 个结果为:
第一次:5,11,4,1,0,3,13,9;
第二次:7,13,15,8,12,12,13,1;
第三次:8,0,0,4,8,1,9,12;
第四次:0,7,4,1,7,6,12,4;
第五次:8,1,0,11,5,0,14,14;
第六次:14,12,13,2,7,15,14,10;
第七次:12,15,15,1,9,14,0,4;
第八次:15,8,8,3,2,3,14,5;
第九次:8,14,5,2,1,15,5,12;
第十次:2,8,13,1,9,2,10,2;
第十一次:10,15,8,2,1,12,12,3;
第十二次:5,4,4,0,14,10,7,4;
第十三次:2,13,10,9,2,4,3,13;
第十四次:13,7,14,9,15,0,1,3;
第十五次:3,1,15,5,11,9,11,4;
第十六次:12,3,4,6,9,3,3,0;
子密钥生成过程中,生成的数值为:
C0=0000000011111111111111111011 D0=1000001101110110000001101000
C1=0000000111111111111111110110 D1=0000011011101100000011010001
C2=0000001111111111111111101100 D2=0000110111011000000110100010
C3=0000111111111111111110110000 D3=0011011101100000011010001000
C4=0011111111111111111011000000 D4=1101110110000001101000100000
C5=1111111111111111101100000000 D5=0111011000000110100010000011
C6=1111111111111110110000000011 D6=1101100000011010001000001101
C7=1111111111111011000000001111 D7=0110000001101000100000110111
C8=1111111111101100000000111111 D8=1000000110100010000011011101
C9=1111111111011000000001111111 D9=0000001101000100000110111011
C10=1111111101100000000111111111 D10=0000110100010000011011101100
C11=1111110110000000011111111111 D11=0011010001000001101110110000
C12=1111011000000001111111111111 D12=1101000100000110111011000000
C13=1101100000000111111111111111 D13=0100010000011011101100000011
C14=0110000000011111111111111111 D14=0001000001101110110000001101
C15=1000000001111111111111111101 D15=0100000110111011000000110100
C16=0000000011111111111111111011 D16=1000001101110110000001101000
解密过程与加密过程相反,所得的数据的顺序恰好相反。在此就不赘述。
参考书目:
《计算机系统安全》 重庆出版社 卢开澄等编着
《计算机密码应用基础》 科学出版社 朱文余等编着
《Visual C++ 6.0 编程实例与技巧》 机械工业出版社 王华等编着
2. 电脑硬盘D被Bitlocker加密,但是密钥文件也被放在加密的D盘里了,怎么调出密钥文件
1、如果你的电脑已连接到域,联系你的管理员获取恢复密钥。
2、如果你的电脑未连接到域,你的 BitLocker 恢复密钥可能保存在多个位置。下面是一些需要检查的位置:
①你的 Microsoft 在线帐户。 该选项只有在未加入域的电脑上才可用。若要获取恢复密钥,请转到 BitLocker 恢复密钥。
②保存的恢复密钥副本。 你可能已经将 BitLocker 恢复密钥副本保存到某个文件、U 盘或打印的打印件。
③如果你已经将密钥保存到某个文件或已打印,则找到副本、按照已锁定电脑上的说明操作,并在得到提示时输入你的密钥。
④如果你已经将密钥保存到 U 盘上,则插入 U 盘并按照该电脑上的说明操作。(如果你已经将恢复密钥另存为 U 盘中的某个文件,则需要打开该文件并手动输入恢复密钥。)
总觉的bitlocker加密硬盘比较麻烦复杂,介绍一种简单的磁盘加密方法,可以试试磁盘加锁专家,使用非常的方便简单。
3. 开船不支持核显
电脑与游戏不兼容造成。
由于12代酷睿采用了性能核+效能核架构,也就是俗称的大小核,引发DRM的问题,特别是其中的D加密保护机制,小核心有可能被视为第三方计算机,导致游戏出现问题。
Intel已经在官网上发布了不兼容游戏列表,微软将在11月份的Windows更新中不断修复问题。
4. 重制版如果是D加密,怎么办
剁手或者不玩呗
5. 游戏D加密是什么意思
Denuvo Anti-Tamper的技术,被现在诸多游戏玩家简称为D加密或Denuvo加密技术。
Denuvo的即一种反篡改技术,它的作用是阻止对可执行文件进行调试、反向工程和修改。Denuvo并不是一种DRM(游戏版权管理)加密技术,Denuvo完全不参与游戏的加密过程,所以也不会对游戏本身造成负面影响,它的作用是让游戏的DRM不被绕过。
Denuvo是Sony DADC旗下的防篡改解决方案公司,已将该技术应用到了包括游戏、软件、电子书等多领域。
(5)12代d加密扩展阅读
就如Denuvo自己说的:“游戏终究会被破解,但是Denuvo反篡改技术可被认为是成功的,因为它延长了游戏发售到被破解的时间。”Denuvo的目的并不是彻底封死破解,而是尽可能延长破解的时间,为游戏发售争取更多的时间。
2017年对于游戏厂商与黑客团队来说,是充满硝烟味的一年,大名鼎鼎的D加密公司Denuvo似乎在2017年遭遇滑铁卢,这一号称最安全加密技术的反盗版措施不仅被屡次快速破解,还爆出了许多负面新闻。
几乎每部D加密游戏上市以后,都很快被CPY攻破,例如《尼尔:机械纪元》、《铁拳7》、《掠食》、《实况足球2018》等等。其中《铁拳7》的破解只用了4天,刷新了《生化危机7》的最速破解记录。
不过在2017年末,似乎D加密技术赢得了最后的大战。在10月26日,育碧发行了《刺客信条》新作《刺客信条:起源》,其中该作品使用新版Denuvo技术。2个月之后,新版Denuvo依然在各路破解者的进攻下固若金汤。
那些仅采用最新版Denuvo的游戏也没被破解,包括《索尼克:力量》《不义联盟2》《足球经理2018》《极品飞车20:复仇》《星球大战:前线2》。理论上说,最新版的D加密保住了这款游戏的销量。步入2018年,许多游戏依然会使用D加密。
6. 战神4有没有d加密
没有。
战神4一般指战神,《战神》是由索尼旗下圣莫尼卡工作室制作的,第三人称动作角色扮演游戏。
拓展:
《战神》是由索尼旗下圣莫尼卡工作室制作的,第三人称动作角色扮演游戏,于2018年4月20日由索尼互动娱乐发行。 [1]
该作是《战神3》的正统续作,官方正式名称为“God of War”,并没有数字序号,也代表了该系列的重启。 [2]
该作对主角克雷多斯来讲,这也是一个史诗级新篇章的开始。他将摆脱神的影子,作为普通人隐居北欧神话的新大陆,为了他的儿子以及新目标,克雷多斯必须为生存而战斗,对抗威胁他全新人生的强大敌人。 [2]
该作于2018年12月7日获TGA 2018年度最佳游戏、最佳动作冒险游戏、最佳游戏指导 [3] ;2018年12月22日获IGN 2018年度最佳游戏 [4] ;2019年2月获D.I.C.E年度最佳游戏 [5] 、第七十一届美国编剧工会奖年度最佳游戏剧本 [6] ;2019年3月获GDC年度最佳游戏 [7] ;2019年4月获第十五届英国电影和电视学院奖最佳游戏
7. 听说这代FM往后没有破解了,说是什么D加密
据说FM17采用D加密,建议大家还是买正版吧。D加密,Denuvo Anti-Tamper,对于其他的加密系统,破解者只需要修改游戏的exe或dll文件绕过游戏对DRM的验证,然后模拟正版环境(如特制的steam_api.dll)即可实现破解。
8. d加密可以激活几次
d加密可以激活4次。Denuvo防篡改英语DenuvoAntiTamper或Denuvo,是由奥地利Denuvo软件解决方案股份有限公司DenuvoSoftwareSolutionsGmbH开发的一种防篡改技术,该公司通过索尼数字音频光盘公司的管理层收购MBO而组成。
d加密的特点
D加密在推出初期之时也属实给力,第二款使用D加密技术的游戏堕落之王本是一款素质平庸的黑魂模仿作,但却可以在Denuvo官网上作为成功典范进行宣传,这当然不是因为其销量良好,而是在于它在使用D加密之后过了200多天才遭到破解,这在当时的业界堪称奇迹。
狂怒2可执行文件的大小就可以看出来该游戏使用了D加密,因为该游戏的可执行文件大小居然高达414MB,而普通的D加密游戏可执行文件一定是大于300MB的,而使用D加密的第二个迹象就是游戏加载时间过长,目前狂怒2的加载时间确实不短。