实例分析常用加密算法

因为最近常用到一些加密的技术,所以就把一些常用的加密算法给大家总结了一下。下面我就通过实例,逐一的把常用算法给大家分析一下。

一、RSA加密算法分析

在谈RSA加密算法之前,我们需要先了解下两个专业名词,对称加密和非对称加密。

对称加密:含有一个称为密钥的东西,在消息发送前使用密钥对消息进行加密,在对方收到消息之后,使用相同的密钥进行解密。

非对称加密:加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密),相反,使用了密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥,顾名思义,私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的代表算法是RSA算法。

了解了这两个名词下面来讲,RSA加密算法。

RSA是目前最有影响力的公钥加密算法,多用于数据加密和数字签名。虽然有这么大的影响力,但是同时它也有一些弊端,它产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密,分组长度太大等。

下面通过实例演示使用RSA加密、解密:

先创建一个全局的CspParameters对象param

加密:

?

private void btnjm_Click(object sender, EventArgs e)

{

param = new CspParameters();

param.KeyContainerName = “Olive”;//密匙容器的名称,保持加密解密一致才能解密成功

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))

{

byte[] plaindata = Encoding.Default.GetBytes(txtyuan.Text);//将要加密的字符串转换为字节数组

byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组

txtjiami.Text =Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串

}

}

解密:

?

private void btnjiemi_Click(object sender, EventArgs e)

{

param = new CspParameters();

param.KeyContainerName = “Olive”;

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))

{

byte[] encryptdata = Convert.FromBase64String(this.txtjiami.Text);

byte[] decryptdata = rsa.Decrypt(encryptdata, false);

txthjiemi.Text = Encoding.Default.GetString(decryptdata);

}

}

效果如图:

实例分析常用加密算法

下面我再通过一个实例向大家演示,通过使用RSA加密算法产出公匙和私匙

?

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

using (StreamWriter sw = new StreamWriter(@”D:\PublicKey.xml”))//产生公匙

{

sw.WriteLine(rsa.ToXmlString(false));

}

using (StreamWriter sw = new StreamWriter(@”D:\PrivateKey.xml”))//产生私匙(也包含私匙)

{

sw.WriteLine(rsa.ToXmlString(false));

}

二、DES加密算法分析:

DES加密:使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。额专业术语就看看得了,下面直接给大家演示一个小demo,以帮助大家的理解。

先定义一个全局的字节数组和实例化一个全局的DESCryptoServiceProvider对象

byte[] buffer;

DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();

加密:

?

private void button2_Click(object sender, EventArgs e)

{

MemoryStream ms = new MemoryStream();//先创建 一个内存流

CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateEncryptor(), CryptoStreamMode.Write);//将内存流连接到加密转换流

StreamWriter sw = new StreamWriter(cryStream);

sw.WriteLine(txtyuan.Text);//将要加密的字符串写入加密转换流

sw.Close();

cryStream.Close();

buffer = ms.ToArray();//将加密后的流转换为字节数组

txtjiami.Text =Convert.ToBase64String(buffer);//将加密后的字节数组转换为字符串

}

解密:

?

private void button1_Click(object sender, EventArgs e)

{

MemoryStream ms = new MemoryStream(buffer);//将加密后的字节数据加入内存流中

CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateDecryptor(), CryptoStreamMode.Read);//内存流连接到解密流中

StreamReader sr = new StreamReader(cryStream);

txthjiemi.Text = sr.ReadLine();//将解密流读取为字符串

sr.Close();

cryStream.Close();

ms.Close();

}

三、MD5加密算法分析

MD5全称是message-digest algorithm 5,简单的说就是单向的加密,即是说无法根据密文推导出明文。

MD5加密算法的主要用途:

1、对用户密码的加密,

2、在哈希函数中计算散列值

3、对一段信息生成信息摘要,该摘要对该信息具有唯一性,可以作为数字签名。

4、用于验证文件的有效性(是否有丢失或损坏的数据),

从上边的主要用途中我们看到,由于算法的某些不可逆特征,在加密应用上有较好的安全性。通过使用MD5加密算法,我们输入一个任意长度的字节串,都会生成一个128位的整数。所以根据这一点MD5被广泛的用作密码加密。下面我用实力给大家演示一下怎样进行密码加密。

先看下MD5加密算法实例效果:

实例分析常用加密算法

具体代码如下:

首先需要引入命名空间:

?

using System.Security;

using System.Security.Cryptography;

private void btnmd5_Click(object sender, EventArgs e)

{

MD5 md5 = new MD5CryptoServiceProvider();

byte[] palindata = Encoding.Default.GetBytes(txtyuan.Text);//将要加密的字符串转换为字节数组

byte[] encryptdata=md5.ComputeHash(palindata);//将字符串加密后也转换为字符数组

txtjiami.Text = Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串

}

这里我们需要注意的是,不论是在加密的过程中,加密前要将加密字符串转为字节数组,加密后也要生成密文的字节数据,然后再转化为密文。

除了我们以上介绍的几种常用的加密算法以外,还有AES加密算法,但是AES加密是一个新的可以用于保护电子数据的加密算法。其产生的密码是迭代对称的分组密码,代加密使用一个循环结构,在该循环中重复置换和替换输入数据。

小知识之加密算法:

数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人窃取、阅读的目的。 该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。

实际操作过程中如何选择加密算法

根据密钥类型不同将现代密码技术分为两类:对称加密算法和非对称加密算法,那我们在实际使用的过程中究竟该使用哪一种比较好呢?那么我们就先从这两种加密算法的概念入手。

对称式加密算法就是加密和解密使用同一个密钥,通常称之为“Session Key ”,这种加密算法目前被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密算法,它的Session Key长度为56Bits。

非对称式加密算法就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。
加密算法的选择

1、我们应该根据自己的使用特点来确定,由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。

2、对称加密算法不能实现签名,因此签名只能非对称算法。

3、由于对称加密算法的密钥管理是一个复杂的过程,密钥的管理直接决定着他的安全性,因此当数据量很小时,我们可以考虑采用非对称加密算法。

在实际的操作过程中,我们通常采用的加密算法:

采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。

如果在选定了加密算法后,那采用多少位的密钥呢?一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择,一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128为即可。

小知识之密钥:

密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的数据。密钥分为两种:对称密钥与非对称密钥。

RSA加密算法被广泛应用于数字签名等领域

在计算机信息传递中,信息发送方甲方,为了保护传输的明文信息不被第三方窃取,采用一个密钥A对要发送的信息进行加密而形成密文M并且发送给乙方,信息的接收方-乙方用另一把密钥B对密文M解密,得到明文消息,从而完成密文通讯。密钥A和密钥B是采用事先商定的某种计算机算法产生的密钥对,其中密钥A为用户私有,密钥B对网络上的大众是公开的,这种安全机制被称为公开密钥加密,公开密钥加密算法又叫非对称密钥加密算法,RSA加密算法就是其中最流行的一种,被广泛应用于简短信息加密和数字签名等领域

一、RSA加密算法简介

RSA加密算法诞生于1978年,是以三位发明人的名字(Rivest,Shamir和Adleman)首字母命名的,它是利用质数因子分解的困难性开发的算法,其保密强度是建立在计算的复杂性的基础之上的。RSA应用中要求每一个用户拥有自己的一种密钥:公开的加密密钥,用于加密明文;保密的解密密钥,用于解密密文。

二、RSA加密算法原理

RSA公开密钥加密算法的基本原理是:

(一)产生密钥对

首先,选择两个大质数,p 和q,计算:

n = p * q

然后,随机选择加密密钥e,要求 e 和 ( p – 1 ) * ( q – 1 ) 互质,且0 < e < ( p – 1 ) * ( q – 1 )。

最后,计算解密密钥d, 要求满足:

e * d = 1 ( mod ( p – 1 ) * ( q – 1 ) )

其中n和d也要互质。数e和 n是公钥,用于加密信息,对所有使用者公开;数d和n是私钥,用于解密信息,用户自己保存。

(二)加密

信息发送者取得对方的公钥e和 n后,对发送的明文信息m进行加密运算可获得加密信息c,对应的密文计算方法是:

c = me mod n

然后通过通信渠道把密文信息c传递给信息接收者。

(三)解密

信息接收者接收到密文信息c后,采用自己掌握的私钥d和n进行解密获取明文信息m,对应的解密运算方法是:

m = cd mod n

由于RSA加密算法速度较慢,通常适用于对少量数据的加密,所以在加密明文信息 m时,首先把m分成等长数据块m1,m2,…,mi ,然后分别对m1,m2,…, mi进行加密,即m = m1m2… mi,c = c1c2… ci ,解密时也是如此。

三、RSA加密算法应用

RSA加密算法除了用于少量数据加密之外,最主要的应用就是数字签名。数字签名是通过密码运算生成一组符号及代码,用于鉴定签名人的身份以及对电子数据内容的认可,它还能验证出文件的原文在传输过程中有无变动,确保传输电子文件的完整性、真实性和不可抵赖性。

(一)数字签名的原理

被发送的文件用SHA编码加密产生128bit的数字摘要;发送方用自己的私有密钥对摘要再加密,形成数字签名;将原文和加密的摘要同时传给对方;对方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生又一摘要;将解密后的摘要和重新用SHA编码加密收到的文件所产生的摘要相互对比。

(二)数字签名运算

数字签名使用者首先采用SHA编码法对欲签名的文件信息m进行数字摘要运算,得出摘要值h(m),再用自己掌握的私钥d和n进行签名运算,可获得数字签名s,之后将数字签名s和文件信息m一起发送给对方。

RSA加密算法是被研究得最广泛的公钥算法,易于理解和操作,可同时用于加密和数字签名,从提出到现在已近三十年,经历了各种攻击的考验,逐渐为人们接受,尽管存在一些瑕疵,但还是被普遍认为是目前最优秀的公钥方案之一。在电子商务应用系统中,RSA加密算法更是惯用的技术之一。

小知识之公开密钥:

公开密钥也称为非对称密钥,每个人都有一对唯一对应的密钥:公开密钥(简称公钥)和私人密钥(简称私钥),公钥对外公开,私钥由个人秘密保存;用其中一把密钥加密,就只能用另一把密钥解密。非对称密钥加密算法的典型代表是RSA。

DSA加密算法解析

DSA加密算法是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。它是一种公开密钥算法,用作数字签名。DSA加密算法使用公开密钥,为接受者验证数据的完整性和数据发送者的身份,它也可用于由第三方去确定签名和所签数据的真实性。

信息交流中,接收方希望收到的信息未被窜改(信息完整性),还希望接收到的信息确由自己认定的发送方所发(信息来源有效性),那么接收方和发送方就可以约定,共同使用DSA加密算法来实现。

算法中应用了下述参数:

p:L bits长的素数。L是64的倍数,范围是512到1024;

q:p – 1的160bits的素因子;

g:g = h^((p-1)/q) mod p,h满足h < p – 1, h^((p-1)/q) mod p > 1;

x:私钥。x为一个随机或伪随机生成的整数,其值满足0<x<q;

y:公钥。y=powm(g,x,p)。

注意:

1、整数p,q,g可以公开,也可以仅由一组特定用户共享。

2、私钥x和公钥y称为一个密钥对(x,y),私钥只能由签名者本人独自持有,公钥则可以公开发布。密钥对可以在一段时间内持续使用。

签名产生过程如下:

1. P产生随机数k,k < q;

2. P计算 r = ( g^k mod p ) mod q

s = ( k^(-1) (H(m) + xr)) mod q

签名结果是( m, r, s )。

3. 验证时计算 w = s^(-1)mod q

u1 = ( H( m ) * w ) mod q

u2 = ( r * w ) mod q

v = (( g^u1 * y^u2 ) mod p ) mod q

若v = r,则认为签名有效。

DSA加密算法的安全性:

DSA加密算法主要依赖于整数有限域离散对数难题,素数P必须足够大,且p-1至少包含一个大素数因子以抵抗Pohlig &Hellman算法的攻击。M一般都应采用信息的HASH值。DSA加密算法的安全性主要依赖于p和g,若选取不当则签名容易伪造,应保证g对于p-1的大素数因子不可约。

重要特点:两个素数公开

DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA的一个重要特点是两个素数公开,这样,当使用别人的p和q时,即使不知道私钥,你也能确认它们是否是随机产生的,还是作了手脚。

小知识之公开密钥:

公开密钥也称为非对称密钥,每个人都有一对唯一对应的密钥:公开密钥(简称公钥)和私人密钥(简称私钥),公钥对外公开,私钥由个人秘密保存;用其中一把密钥加密,就只能用另一把密钥解密。

Rijndael加密算法解析

Rijndael加密算法的128位输入分组用以字节为单位的正方形矩阵描述,该数组被复制到State数组。加密过程分为四个阶段:密钥扩展、轮密钥加、Nr-1(对应128、1Array2、256位密钥长度,Nr分别为10、12、14)轮变换及最后一轮变换。轮变换包括字节代换、行移位、列混淆和轮密钥加四个过程,最后一轮变换包括字节代换、行移位和轮密钥加三个过程。Rijndael 中的某些操作是在字节级上定义的,字节表示有限字段GF(2 ) 中的元素,一个字节中有8 位。其它操作都根据4 字节字定义。

用伪C代码表示如下:

Rijndael (State, CipherKey) {

KeyExpansion (CipherKey, ExpandKey); //密钥扩展

AddRoundKey (State, RoundKey); //轮密钥加

For (i=1;i<Nr;i++)

Round (State, ExpandKey+4*i); //轮变换

FinalRound (State, ExpandKey+4 * Nr); //最后一轮变换}

Round (State, RoundKey){ //轮变换

SubByte (State); //字节代换

ShiftRow(State); //行移位

MixColumn(State); //列混淆

AddRoundKey(State, RoundKey); 轮密钥加

FinalRound(State, RoundKey) { //最后一轮变换

SubByte(State);

ShiftRow(State);

AddRoundKey(State,RoundKey);

Rijndael.s程序实现加密算法步骤

Rijndael.s主要通过ARM汇编子程序调用完成加密算法,包括1个代码段和1个数据段。它把算法所使用的所有变换均用同名ARM汇编子程序实现。代码段包括以下几个模块:

首先,进行明文、密钥预处理。明文可以从开发板键盘上接收,也可以是常量或参数传递过来的变量。

其次,调用子程序KeyExpansion完成密钥扩展。

第三,调用子程序AddRoLundKey完成初始轮密钥加。

第四,轮变换。包括四个步骤:①调用于程序SubByte进行字节代换;②调用子程序ShiftRow进行行移位;③调用子程序MixColumn进行列混淆;④调用子程序Ad-dRoundKey进行轮密钥加。本过程重复Array次。

第五,最后一轮变换。包括三个步骤:①调用子程序SubByte进行字节代换;②调用子程序ShiftRow进行行移位;③调用子程序AddRoundKey进行轮密钥加。

最后,对生成的密文进行进一步处理,即把密文视为4×4数组,将其行与列对调。

Rijndael加密算法实现效率比较

在调用ARM汇编程序实现Rijndael加密算法之余,还在嵌入式微处理器ARM上通过调用C子程序实现了Rijndael算法,同样获得了正确结果。表1、表2是两种实现方式的空间与时间效率比较。

Rijndael加密算法解析

Rijndael加密算法解析

由表1知,ARM子程序比C子程序所占用的空间明显小得多,前者仅为后者的55%。由表2,运行一次ARM汇编程序Rijndael.s程序完成加密算法,仅需约0.657 tick(此处,1000 tick=1s),而运行一次c子程序约需0.996 tick,比前者增加了52%。高级加密标准Rijndael算法在嵌入式微处理器ARM上的实现具有一定的实用价值。

小知识之子程序:

在一个加工程序中,如果其中有些加工内容完全相同或相似,为了简化程序,可以把这些重复的程序段单独列出,并按一定的格式编写成子程序。主程序在执行过程中如果需要某一子程序,通过调用指令来调用该子程序,子程序执行完后又返回到主程序,继续执行后面的程序段。

DES加密算法解析

目前在国内,随着三金工程尤其是金卡工程的启动,DES加密算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域均被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES加密算法。

DES加密算法入口参数有3个

DES加密算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES加密算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES加密的工作方式有两种:加密或解密。

DES加密算法工作原理

DES加密算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密,生成Data的密码形式(64位)作为DES加密算法的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。

在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。

通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

DES加密算法解析

DES加密算法功能主要是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:

58,50,12,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,

即将输入的第58位换到第一位,第50位换到第2位,…,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3……D64,则经过初始置换后的结果为:L0=D58D50…D8;R0=D57D49…D7。

经过16次迭代运算后。得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第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,

放大换位表
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, 1,

单纯换位表
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,
在f(Ri,Ki)算法描述图中,S1,S2…S8为选择函数,其功能是把6bit数据变为4bit数据。

下面给出选择函数Si(i=1,2……的功能表:

选择函数Si
S1:
14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7,
0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8,
4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0,
15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13,
S2:
15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10,
3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5,
0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15,
13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9,
S3:
10,0,9,14,6,3,15,5,1,13,12,7,11,4,2,8,
13,7,0,9,3,4,6,10,2,8,5,14,12,11,15,1,
13,6,4,9,8,15,3,0,11,1,2,12,5,10,14,7,
1,10,13,0,6,9,8,7,4,15,14,3,11,5,2,12,
S4:
7,13,14,3,0,6,9,10,1,2,8,5,11,12,4,15,
13,8,11,5,6,15,0,3,4,7,2,12,1,10,14,9,
10,6,9,0,12,11,7,13,15,1,3,14,5,2,8,4,
3,15,0,6,10,1,13,8,9,4,5,11,12,7,2,14,
S5:
2,12,4,1,7,10,11,6,8,5,3,15,13,0,14,9,
14,11,2,12,4,7,13,1,5,0,15,10,3,9,8,6,
4,2,1,11,10,13,7,8,15,9,12,5,6,3,0,14,
11,8,12,7,1,14,2,13,6,15,0,9,10,4,5,3,
S6:
12,1,10,15,9,2,6,8,0,13,3,4,14,7,5,11,
10,15,4,2,7,12,9,5,6,1,13,14,0,11,3,8,
9,14,15,5,2,8,12,3,7,0,4,10,1,13,11,6,
4,3,2,12,9,5,15,10,11,14,1,7,6,0,8,13,
S7:
4,11,2,14,15,0,8,13,3,12,9,7,5,10,6,1,
13,0,11,7,4,9,1,10,14,3,5,12,2,15,8,6,
1,4,11,13,12,3,7,14,10,15,6,8,0,5,9,2,
6,11,13,8,1,4,10,7,9,5,0,15,14,2,3,12,
S8:
13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7,
1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2,
7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8,
2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11,

在此以S1为例说明其功能,我们可以看到:在S1中,共有4行数据,命名为0,1、2、3行;每行有16列,命名为0、1、2、3,……,14、15列。

现设输入为: D=D1D2D3D4D5D6
令:列=D2D3D4D5
行=D1D6

然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1的输出。

下面给出子密钥Ki(48bit)的生成算法

从子密钥Ki的生成算法描述图中我们可以看到:初始Key值为64位,但DES算法规定,其中第8、16、……64位是奇偶校验位,不参与DES运算。故Key 实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64 位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、……、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:

循环左移位数
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1

以上介绍了DES加密算法的加密过程。DES加密算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、……,最后一次用K0,算法本身并没有任何变化。

DES加密算法具有很高的安全性

DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES加密算法密钥的长度再增长一些,以此来达到更高的保密程度。

由上述DES加密算法介绍我们可以看到:DES加密算法中只用到64位密钥中的其中56位,而第8、16、24、……64位8个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了8,16,24,……64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第8,16,24,……64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES加密算法安全可靠地发挥作用。如果不了解这一点,把密钥Key的8,16,24,….. .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES加密算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。

小知识之密文:

为了确保网络安全,仅仅安装防火墙是不够的,还需要采用其他技术,如用户验证、入侵检测、密码技术等,所以产生了密文。通常我们把明文通过密钥加密成密文,从而保护我们的信息。

RSA加密算法解析

RSA加密算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行,它经历了各种攻击,至今未被完全攻破。RSA加密算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA加密算法的安全性一直未能得到理论上的证明。

RSA加密算法解析 :

首先, 找出三个数, p, q, r,
其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数……
p, q, r 这三个数便是 private key

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1)…..
这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了…..
再来, 计算 n = pq…….
m, n 这两个数便是 public key

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n….
如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t),
则每一位数均小於 n, 然後分段编码……
接下来, 计算 b == a^m mod n, (0 <= b < n),
b 就是编码後的资料……

解码的过程是, 计算 c == b^r mod pq (0 <= c < pq),
於是乎, 解码完毕…… 等会会证明 c 和 a 其实是相等的

如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b……
他如果要解码的话, 必须想办法得到 r……
所以, 他必须先对 n 作质因数分解………
要防止他分解, 最有效的方法是找两个非常的大质数 p, q,
使第三者作因数分解时发生困难………

<定理>
若 p, q 是相异质数, rm == 1 mod (p-1)(q-1),
a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq,
则 c == a mod pq

证明的过程, 会用到费马小定理, 叙述如下:
m 是任一质数, n 是任一整数, 则 n^m == n mod m
(换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m)
运用一些基本的群论的知识, 就可以很容易地证出费马小定理的……..

<证明>
因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数
因为在 modulo 中是 preserve 乘法的
(x == y mod z and u == v mod z => xu == yv mod z),
所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq

1. 如果 a 不是 p 的倍数, 也不是 q 的倍数时,
则 a^(p-1) == 1 mod p (费马小定理) => a^(k(p-1)(q-1)) == 1 mod p
a^(q-1) == 1 mod q (费马小定理) => a^(k(p-1)(q-1)) == 1 mod q
所以 p, q 均能整除 a^(k(p-1)(q-1)) – 1 => pq | a^(k(p-1)(q-1)) – 1
即 a^(k(p-1)(q-1)) == 1 mod pq
=> c == a^(k(p-1)(q-1)+1) == a mod pq

2. 如果 a 是 p 的倍数, 但不是 q 的倍数时,
则 a^(q-1) == 1 mod q (费马小定理)
=> a^(k(p-1)(q-1)) == 1 mod q
=> c == a^(k(p-1)(q-1)+1) == a mod q
=> q | c – a
因 p | a
=> c == a^(k(p-1)(q-1)+1) == 0 mod p
=> p | c – a
所以, pq | c – a => c == a mod pq

3. 如果 a 是 q 的倍数, 但不是 p 的倍数时, 证明同上

4. 如果 a 同时是 p 和 q 的倍数时,
则 pq | a
=> c == a^(k(p-1)(q-1)+1) == 0 mod pq
=> pq | c – a
=> c == a mod pq
Q.E.D.

这个定理说明 a 经过编码为 b 再经过解码为 c 时, a == c mod n (n = pq)….
但我们在做编码解码时, 限制 0 <= a < n, 0 <= c < n,
所以这就是说 a 等於 c, 所以这个过程确实能做到编码解码的功能…..

RSA加密算法的安全性依赖于大数分解

RSA加密算法的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA加密算法就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前,RSA 加密算法的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。

RSA加密算法的速度较慢,一般只用于少量数据加密

由于进行的都是大数计算,使得RSA加密算法最快的情况也比DES加密算法慢上倍,无论是软件还是硬件实现。速度一直是RSA加密算法的缺陷。一般来说RSA加密算法只用于少量数据加密。

RSA加密算法在选择密文攻击面前很脆弱

一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:

( XM )^d = X^d *M^d mod n

前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征–每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用One-Way HashFunction 对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方法。

RSA加密算法公共模数攻击方法

若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:

C1 = P^e1 mod n

C2 = P^e2 mod n

密码分析者知道n、e1、e2、C1和C2,就能得到P。

因为e1和e2互质,故用Euclidean算法能找到r和s,满足:

r * e1 + s * e2 = 1

假设r为负数,需再用Euclidean算法计算C1^(-1),则

( C1^(-1) )^(-r) * C2^s = P mod n

另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享模数n。

RSA加密算法的小指数攻击

有一种提高RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有所提高。但这样做是不安全的,对付办法就是e和d都取较大的值。

RSA加密算法的缺点

A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

B)分组长度太大,为保证安全性,n 至少也要 600 bits 以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。

目前,SET( Secure Electronic Transaction )协议中要求CA采用比特长的密钥,其他实体使用比特的密钥。

小知识之公钥:

公钥是与私钥算法一起使用的密钥对的非秘密一半。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。公钥和私钥是通过一种算法得到的一个密钥对(即一个公钥和一个私钥)其中的一个向外界公开,称为公钥;另一个自己保留,称为私钥。

常用的加密算法介绍

加密是将可读信息(明文)变为代码形式(密文);解密是加密的逆过程,相当于将密文变为明文。从本质上说加密技术是对信息进行编码和解码的技术。

加密算法有很多种,这些算法一般可分为三类:

对称加密算法;

非对称加密算法;

单向加密算法。

对称加密算法应用较早,技术较为成熟。其过程如下:

1:发送方将明文用加密密钥和加密算法进行加密处理,变成密文,连同密钥一起,发送给接收方;

2:接收方收到密文后,使用发送方的加密密钥及相同算法的逆算法对密文解密,恢复为明文。

在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道对方使用的加密密钥。其算法一般公开,优势是计算量较小、加密速度较快、效率较高。不足之处是,通信双方都使用同样的密钥,密钥在传送的过程中,可能被敌方获取,安全性得不到保证。当然,为了安全起见,用户每次使用该算法,密钥可以更换,但是原来通信的密钥也不能马上删除,这样,使得双方所拥有的密钥数量很大,对于双方来说,密钥管理较为困难。

对称加密算法中,目前流行的算法有:

DES;

3DES;

IDEA;

AES。

其中,AES由美国国家标准局倡导,即将作为新标准取代DES。

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。每个人都可以产生这两个密钥,其中,公开密钥对外公开(可以通过网上发布,也可以传输给通信的对方),私有密钥不公开。

常用的加密算法介绍

对于同一段数据,利用非对称加密算法具有如下性质:

1:如果用公开密钥对数据进行加密,那么只有用对应的私有密钥才能对其解密;

2:如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能对其解密。

非对称加密算法的基本过程是:

1:通信前,接收方随机生成一对公开密钥和私有密钥,将公开密钥公开给发送方,自己保留私有密钥;

2:发送方利用接收方的公开密钥加密明文,使其变为密文;

3:接收方收到密文后,使用自己的私有密钥解密密文,获得明文。

目前,在非对称密码体系中,使用得比较广泛的是非对称加密算法有:

RSA;

美国国家标准局提出的DSA;

非对称加密算法和对称加密算法相比,保密性较好

和对称加密算法相比,非对称加密算法的保密性比较好,在通信的过程中,只存在公开密钥在网络上的传输,而公开密钥被敌方获取,也没有用;因此,基本不用担心密钥在网上被截获而引起的安全的问题。但该加密体系中,加密和解密花费时间比较长、速度比较慢,一般情况下,它不适合于对大量数据的文件进行加密,而只适用于对少量数据进行加密。

单向加密算法加密时不需要使用密钥

另一类算法是单向加密算法。该算法在加密过程中,输入明文后由系统直接经过加密算法处理,得到密文,不需要使用密钥。既然没有密钥,那么就无法通过密文恢复为明文。

那么这种方法有什么应用呢?主要是可以用于进行某些信息的鉴别。在鉴别时,重新输入明文,并经过同样的加密算法进行加密处理,得到密文,然后看这个密文是否和以前得到的密文相同,来判断输入的明文是否和以前的明文相同。这在某种程度上讲,也是一种解密。

该方法计算复杂,通常只在数据量不大的情形下使用,如计算机系统口令保护措施中,这种加密算法就得到了广泛的应用。近年来,单向加密的应用领域正在逐渐增大。

应用较多单向加密算法的有:

RSA公司发明的MD5算法;

美国国家安全局(NSA) 设计,美国国家标准与技术研究院(NIST) 发布的SHA;等等。

大多数语言体系(如.net、Java)都具有相关的API支持各种加密算法。

提示:

加密算法的实现,实际上利用了高级语言中包装的API。实际上,在真实应用的场合,我们可以使用系统提供的加密解密函数进行加密解密,因为这些函数的发布,经过了严密的测试,理论上讲是安全的。

相关阅读:

对称加密算法介绍

非对称加密算法介绍

小知识之密文:

为了确保网络安全,仅仅安装防火墙是不够的,还需要采用其他技术,如用户验证、入侵检测、密码技术等。所以产生了密文。通常我们把明文通过密钥加密成密文,从而保护我们的信息。

非对称加密算法介绍

非对称加密算法在保护通信安全方面有很大的优势

和对称加密算法一样,非对称加密算法也提供两个加密函数:数据加密和数据解密,但该算法和对称加密算法有两个重要的区别。首先,用于数据解密的密钥值与用于数据加密的密钥值不同;其次,非对称加密算法比对称加密算法慢数千倍,但在保护通信安全方面,非对称加密算法却具有对称密码难以企及的优势。

为说明这种优势,来回顾一下前面使用对称加密算法的例子。

Alice使用密钥K加密数据并将其发送给Bob,Bob收到加密的数据后,使用密钥K对其解密以恢复原始消息。这里存在一个问题,即Alice如何将用于加密数据的密钥值发送给Bob?

答案是,Alice发送密钥值给Bob时必须通过独立的安全通信信道(即没人能监听到该信道中的通信)。

这种使用独立安全信道来交换对称加密算法密钥的需求会带来更多问题。

首先,如果有独立的安全信道,为什么不直接用它发送原始数据?答案通常是安全信道的带宽有限,如安全电话线或可信的送信人。

其次,Alice和Bob能假定他们的密钥值可以保持多久而不泄露(即不被其他人知道)以及他们应在何时交换新的密钥值?

对这两个问题的回答属于密钥管理的范畴。

密钥管理

密钥管理是使用加密算法时最棘手的问题,它不仅涉及如何将密钥值安全地分发给所有通信方,还涉及密钥的生命周期管理、密钥被破解时应采取什么措施等问题。Alice和Bob的密钥管理需求可能并不复杂,他们可以通过电话(如果确定没人监听)或通过挂号信来交换密码。但如果Alice不仅需要与Bob安全通信,还需要与许多其他人安全通信,那么她就需要与每个人交换密钥(通过可靠的电话或挂号信),并管理这一系列密钥,包括记住何时交换新密钥、如何处理密钥泄漏和密钥不匹配(由于使用的密钥不正确,接收方无法解密消息)等。

当然,这些问题不只Alice会遇到,Bob和其他每个人都会遇到,他们都需要交换密钥并处理这些令人头痛的密钥管理问题(事实上,X9.17是一项DES密钥管理ANSI标准[ANSIX9.17])。如果Alice要给数百人发送消息,那么事情将更麻烦,她必须使用不同的密钥值来加密每条消息。例如,要给200个人发送通知,Alice需要加密消息200次,对每个接收方加密一次消息。显然,在这种情况下,使用对称加密算法来进行安全通信的开销相当大。

非对称加密算法的优势

非对称加密算法的主要优势是使用两个而不是一个密钥值:一个密钥值用来加密数据,另一个密钥值用来解密数据。这两个密钥值在同一个过程中生成,称为密钥对。用来加密消息的密钥称为公钥,用来解密消息的密钥称为私钥。用公钥加密的消息只能用与之对应的私钥来解密,私钥除了持有者外无人知道,而公钥却可通过非安全管道来发送或在目录中发布。

仍用前面的例子来说明如何使用非对称加密算法来交换数据,Alice需要通过电子邮件给Bob发送一个机密文档。首先,Bob使用电子邮件将自己的公钥发送给Alice。然后Alice用Bob的公钥对文档加密并通过电子邮件将加密数据发送给Bob。由于任何用Bob的公钥加密的消息只能用Bob的私钥解密,因此即使窥探者知道Bob的公钥,消息也仍是安全的。Bob在收到加密消息后,用自己的私钥进行解密从而恢复原始文档。

下图说明了分别使用公钥和私钥来加密和解密消息的过程。

非对称加密算法介绍

如果Bob需要将编辑后的文档发回给Alice,他可以让Alice先将其公钥发送给他,然后再用该公钥对编辑后的文档加密,并通过电子邮件将加密的文档发回给Alice。由于只有Ali
ce的私钥能解密该消息,并且只有Alice才有该私钥,因此消息是安全的,不能被其他人窥探。

非对称加密算法介绍

非对称加密算法和对称加密算法的重要差别

非对称加密算法和对称加密算法之间有一个重要的差别:Alice和Bob不需要使用独立的安全管道交换用于加密消息的密钥值,从而解决了对称加密算法中一个重要的密钥管理问题:如何将密钥值告诉对方。

在非对称加密算法中,用于加密消息的密钥值是对所有人公开的。这还解决了对称密钥管理中另一个令人头疼的问题:必须与每个通信方交换密钥值。在非对称加密算法中,任何需要给Alice发送安全消息的人都可以使用Alice的公钥。

非对称加密算法的加密速度慢

回想一下,非对称加密算法和对称加密算法之间的一个差别是,非对称加密算法的加密速度慢得多,比对称加密算法慢数千倍[WeiDai02]。在实际应用中,这种问题可以通过如下方式解决:用非对称加密算法来传送临时对称密钥值,然后使用对称加密算法和该临时密钥来加密消息。这种对称密钥之所以是临时的(只持续一段时间),是因为它只使用一次,而不像传统的对称密钥机制要求的那样持续可用或可重复使用。

再回到前面的例子,Alice通过电子邮件给Bob发送机密文档。Alice首先需要生成一个临时密钥值,用于使用对称加密算法加密文档。然后创建另一个数据,即用Bob的公钥加密该临时密钥值,再将这两个数据都发送给Bob。收到数据后,Bob首先用自己的私钥解密出临时密钥值,再使用该临时密钥值(使用对称加密算法)来解密密文文档以恢复原始文档。

下图给出了如何结合使用非对称加密算法和对称加密算法。

非对称加密算法介绍

非对称加密算法的例子有RSA、Elgamal和ECC(椭圆曲线加密算法)。

RSA是目前最常用的算法。Elgamal是另一种常用的非对称加密算法,由Taher Elgamal于1985年发明,其基础是DiffieˉHellman密钥交换算法,后者使通信双方能通过公开通信来推导出只有他们知道的 秘密密钥值[DiffieˉHellman]。

DiffieˉHellman是Whitfield Diffie和Martin Hellman于1976年发明的,被视为第一种 非对称加密算法,尽管非对称加密算法的概念于6年前就已在英国提出了。DiffieˉHellman 与RSA的不同之处在于,DiffieˉHellman不是加密算法,它只是生成可用作对称密钥的秘密数值。在DiffieˉHellman密钥交换过程中,发送方和接收方分别生成一个秘密的随机数,并根据随机数推导出公开值,然后,双方再交换公开值。

DiffieˉHellman算法的基础是具备生成共享密钥的能力。只要交换了公开值,双方就能使用自己的私有数和对方的公开值来生成 对称密钥,称为共享密钥,对双方来说,该对称密钥是相同的,可以用于使用对称加密算法 加密数据。与RSA相比,DiffieˉHellman的优势之一是每次交换密钥时都使用一组新值,而 使用RSA算法时,如果攻击者获得了私钥,那么他不仅能解密之前截获的消息,还能解密之后 的所有消息。然而,RSA可以通过认证(如使用X.509数字证书)来防止中间人攻击,但Diff ieˉHellman在应对中间人攻击时非常脆弱。

加密算法的常见挑战

将安全应用于诸如Web应用服务器等计算系统时,安全设计人员必须克服因使用本章前 面所讨论的安全工具而面临的挑战。在实施加密算法(如对称加密算法)时,设计人员必须 首先对工具进行研究并避开其弱点,例如,某些加密算法使用一组“弱”密钥,即比较容易 被狡猾攻击者破解的密钥值。使用安全解决方案时,安全设计人员所面临的挑战有,恰当地 生成用作密钥值的随机数、密钥管理、证书撤销问题、信任模型和威胁建模。

小知识之对称加密算法:

对称加密算法是一种隐藏数据含义的数据变换机制,该算法提供两个函数:数据加密和数据解密。它们之所以称为对称的,是因为消息发送方和接收方必须使用相同的密钥来加密和解密数据。

点击对称加密算法介绍

对称加密算法介绍

对称加密算法是一种隐藏数据含义的数据变换机制,该算法提供两个函数:数据加密和数据解密。

它们之所以称为对称的,是因为消息发送方和接收方必须使用相同的密钥来加密和解密数据。

加密函数将数据和密钥值作为输入,生成并输出与输入消息大致等长的随机字节序列;解密函数与加密函数同样重要,它以加密函数输出的随机字节序列和加密函数使用的密钥作为输入,生成原始数据。

“对称”一词是指,要成功地解密数据,必须使用用于数据加密的密钥值来解密。

对称加密算法旨在保护数据的机密性。例如,如果Alice要向Bob发送一份机密文档,可以使用电子邮件;然而电子邮件的隐私性和明信片一样差。为防止未知方打开该文档,Ali ce可以使用对称加密算法和适当的密钥来加密数据,然后通过电子邮件将其发送出去。在邮件发送至Bob的过程中任何打开邮件的人看到的只是随机字节序列,而不是机密文档。Bob收到加密邮件后,将数据和Alice使用的密钥值输入Alice使用的对称加密算法的解密函数,该函数将输出原始数据,即机密文档。

对称加密算法介绍

最简单的对称密钥加密算法凯撒加密算法

一种简单的对称密钥加密算法是旋转加密算法,也称为凯撒加密算法。这种算法是这样加密数据的:将每个字母替换为其后的第n个字母。例如,如果n(广义“密钥值”)等于3, 那么用字母D代替字母A,用字母E代替字母B,用字母F代替字母C,依此类推。对于字母表末尾的字母,则绕回到开头,用字母Z代替字母W,字母A代替字母X,字母B代替字母Y,字母C代 替字母Z等。

因此,当使用密钥值为7的旋转加密算法来加密明文消息“WINNERS USE JAVA” 时,密文为“DPUULYZ BZL QHCH”。即使没有计算机协助,攻击者也能轻易破解旋转加密算 法,因为只需尝试所有可能的密钥值(只有26种),便能破解密加密数据。

然而,也有很多经过实践检验的对称加密算法可供选择,如DES、IDEA、AES(Rijndael )、Twofish和RC2等。对于对称加密算法,和任何加密算法一样,明智的开发人员会选择一种经实践检验的算法,而不是从头开发。经实践检验的算法都经过大量的详 细审查,如Rijndael和Twofish算法,有很多算法因为漏洞和弱点而被淘汰了[RSA02]。

对称加密算法有两种:块加密算法和流加密算法。

块加密算法每次加密一个数据块(通常 为8或16字节);流加密算法是相对较新的算法,通常比块加密算法快。但块加密算法更常用 ,这可能是由于它们已使用了较长时间,可免费使用的算法很多[RSA02]。块加密算法的例子有DES、IDEA、AES(Rijindael)和Blowfish;流加密算法的例子有RC4和WAKE。由于与SSL 一起用于所有Web浏览器中,Ron Rivest的RC4是应用最广泛的流加密算法,但要采用该算法 必须有RSA公司的许可证。在某些模式下,块加密算法能模拟流加密算法的行为。

高级加密标准(Advanced Encryption Standard,AES)

在对称加密算法中,对AES应特别予以关注,因为它已取代DES成为美国政府认可的对称 加密算法标准。AES算法称为“Rijndael”,其发明者是比利时密码学家Joan Daemen和Vinc ent Rijmen,美国国家标准和技术研究所(NIST)从21种加密算法中将其挑选出来。

自1977年以来,DES一直都是美国联邦政府加密敏感信息的标准方法[AES01]。但是随着计算能力的不断提高,DES也逐渐滑向极易攻破的危险境地。1987年,美国政府启动了旨在标准化 加密算法的Capstone项目,其中还包括称为Skipjack的算法,但由于该算法是保密的,密码 学家不能分析其弱点,鉴于此以及其他一些情况[RSA03]),虽然Skipjack算法最终于199 8年公开发表了,但还是未能得到广泛普及[Schneier04]。

1997年,NIST宣布将DES的替代算法命名为AES,并将从公开参选的多种算法中甄选,任何人都可以递交参选算法,任何算法都将公诸于众,并将根据多种评判标准(包括运算速度 和操作的简易度)来决出胜出者。2000年10月2日,Rijndael算法击败决赛对手Bruce Schne ier的Twofish算法和Ron Rivest的RC6算法脱颖而出。Rijndael是一种块加密算法,其密钥长 度为128、192或256位,块长度为128、192或256位。

AES竞赛是计算机安全领域中一项里程碑式的活动,它体现了对一项重要概念的认同,即 从长远看,公开审查的加密算法比秘密开发的算法更加安全。

再谈哈希(HASH)加密算法

目前很多网站都用 MD5 算法保存用户密码,但对于哈希(HASH)加密算法的认识还存在很多误区,所以今天就有必要再重新认识一下哈希加密算法。

一、哈希加密算法不是加密算法

哈希加密算法是一种消息摘要算法,不是一种加密算法,但由于其单向运算,具有一定的不可逆性,成为加密算法中的一个构成部分,完整的加密机制不能仅依赖哈希加密算法。

二、哈希加密算法的破解与社会工程学

哈希加密算法本身为单向性,很难直接破解,现有的破解都是将常用字符计算HASH值后反向比较。例如密码123456,假设MD5值为1ab9744e58acee3ed8f03508cbf82bf5,那么数据库中查到MD5值即知道了密码。通过社会工程学的应用,大量常用密码已可直接破解。

三、哈希加密算法的碰撞现象

哈希加密算法可以理解为将任意的信息经过提炼后,成为一个定长的字符串。世界上的信息数量为无穷大,所以定长的字符串不可能表达所有的摘要,因此存在所谓的“碰撞”,即2个同样的信息源摘要是一样的。

2004年山东大学王晓云提出有关快速查找“碰撞对”的算法,引起安全界对于HASH算法的极大关注,NIST提出到2010年不再使用MD5和SHA-1。目前仍可使用的哈希加密算法包括:SHA-256,SHA-512,SHA-224,SHA-384。

2011年2月FIPS180-4草案还增加了SHA-512/224,SHA-512/256。这些算法都是SHA-2系列算法,SHA3-256算法也即将到来。

关于碰撞必须还要说的是,有几率找到碰撞对,但并不意味着哈希加密算法整体被否定,例如将合同文本整体哈希加密算法并数字签名,如果找到碰撞对,很难还原成一个正常的文本,如果是一堆乱码,没有人会认可此文件,在不篡改哈希加密算法的前提下无法有实际意义的修改合同。

四、合理使用哈希加密算法

1. 废除旧算法,至少使用SHA-256,64位操作系统SHA-512运算速度更佳,建议选用。

2. 合理加点“SALT”,即干扰字符串。

例如:SALT1=C`3/$xUM,5ltL4pze;avf9#kgmET^ SALT2=1qYIs,vOSfn%UHhm5+3TX:#iety0d 计算HASH SHA-512(SALT1+用户名+SALT2+密码)

那么社会工程学和目前的暴力运算是无法解决的。

3. 不要以为联合使用HASH算法会安全。例如MD5+SHA1,或者SHA1(MD5)嵌套,有文献证实都是无效的。

小知识之社会工程学:

社会工程学是关于建立理论通过自然的、社会的和制度上的途径并特别强调根据现实的双向计划和设计经验来一步一步地解决各种社会问题。

浅析RSA加密算法的安全性

现在人们普遍将互联网作为信息传送的平台,但在互联网上进行信息的传送存在许多不安全因素.为了确保重要信息在网上安全传输,目前采用的措施主要有3种:安全信道、加密技术和信息隐藏,其中加密技术是应用最广的一种,虽然目前理论上没有不能被破解的加密算法,但只要加密后的数据在要求的时间内不被破解,数据就是安全的。目前的密码体制分为对称密码体制和非对称密码体制2种,非对称密码体制的密钥的管理和传送很方便,在通过网络传输信息时,公钥密码算法体现出了单密钥加密算法不可替代的优越性,其中公钥密码体制的算法中最著名的代表是RSA算法,RSA算法的安全性问题尚未得到理论上的证明,笔者就其安全性进行了一定的分析.

1 RSA加密算法的描述

RSA算法是一个基于初等数论定理的公钥密码体制加密算法,它的实现过程为:选取2个大素数p与q,然后算出n=pq,φ(n)=n-p-q+1,再选取一个正整数e,使之满足(e,φ(n))=1,1<E<Φ(N);再求出正整数D,使之满足1<D,而密钥是.明文消息m满足0≤m

例 取2个质数p=11,q=13,p和q的乘积为n=p×q=143,算出φ(n)=n-p-q+1=120;再选取一个与φ(n)互质的数,例如e=7,则公开密钥=n,e=143,7.

对于这个e值,用欧几里德扩展算法可以算出其逆:d=103.因为e×d=7×103=721,满足e×d mod z =1;即721 mod 120=1成立.则秘密密钥=n,d=143,103,

设发送方需要发送机密信息(明文)m=85,发送方已经从公开媒体得到了接收方的公开密钥n,e=143,7,于是发送方算出加密后的密文c= me mod n=857 mod 143=123并发送给接收方.

接收方在收到密文c=123后,利用只有他自己知道的秘密密钥计算m= cd mod n =123103 mod 143=85,所以,接收方可以得到发送方发给他的真正信息m=85,实现了解密.

用RSA体制加密时,先将明文数字化再进行加密,在实际应用中m值的长度一般要远大于n的长度,因此实际加密消息m时,首先将它分成比n小的数据分组(采用二进制数,选取小于n的2的最大次幂),再每组单独加密和解密.比如说,选用的p和q为100位的素数,那么n将有200位,每个数据分组应小于200位长,但为保证安全性,每个数据的长度应尽量接近n的长度.

2 RSA算法的加密强度与因子分解强度

目前密码的破译主要有2种方法.方法之一是密钥的穷尽搜索,其破译方法是尝试所有可能的密钥组合.虽然大多数的密钥尝试都是失败的,但最终有一个密钥让破译者得到原文,这个过程称为密钥的穷尽搜索.方法之二是密码分析.由于RSA算法在加密和解密过程都是用指数计算,其计算工作量巨大,用穷尽搜索法进行破译是根本不可能的.因此要对RSA算法加密后的信息进行破译只能采用密码分析法,用密码分析法攻击RSA密码系统,途径之一是直接计算“n的e次方根”,但目前还没有解决这一问题的算法,这个问题是现实不可计算的问题;途径之二[4]是想办法计算出d,欲得到d,可考虑从以下3个方面入手.

(1) 将数n分解因子

密码分析员一旦分解出n的因子p和q,就可以先后求出φ(n)和d,从而攻破RSA公开钥密码系统.由此得出如下结论:破译RSA密码不可能比分解因子的问题更困难.

(2) 不分解n的因子计算φ(n)

显然,如果密码分析员能够求出φ(n),由于e是公开的,就可以通过de≡1 (modφ(n))算出d,从而攻破RSA密码系统.但是,一旦密码分析员知道了φ(n),他就可以很容易地分解出n的因子.究其原因为

φ(n)=n-(p+q)+l,

所以,由n及φ(n)可以计算出(p+q).有了(p+q),就可以通过p-q=(p+q)2-4n求出(p-q),因而最终解出p和q.计算φ(n)的方法并不比分解n的因子容易,换言之,通过计算φ(n)破译RSA密码的方法不会比通过分解n的因子破译RSA密码的方法更容易.

(3) 不分解n的因子或计算φ(n)确定d

如果能够知道d,分解n的因子问题也同样会变得容易起来.因为φ(n)=(ed-1)×k,其中k为任意整数,已知d (e 是公开的)时,可求出φ(n),根据φ(n)=n-(p+q)+l,由于n是已知的(公开的),在求出φ(n)时可求出p+q,设求出的p+q=r,又由于n=p×q,从而可得p×p-p×r+n=0,这是一个一元二次方程,自然可非常简单求出p,同理可求出q,分解n完成.

G. L. Miller在1975年指出,利用φ(n)的任何倍数都可以容易地分解出n的因子.因此,用Miller算法就可以由(ed-1)分解出n的因子,也就是说计算d并不比分解n的因子更容易.密码分析员还可能希望找到某个与d等价的d′,从而攻破RSA密码.但是,所有这样的d′只相差(p-1)和(q-1)的最小公倍数的整数倍,因此,找到一个这样的d′就可以使分解n的因子问题变得容易起来,也即找到这样的d′并不比分解n的因子更容易.

综上所述,破译RSA密码系统和分解因子问题同样困难,尽管目前还不能完全证实它,即在目前状况下,如果参数p,q和e选取恰当的话,RSA的加密强度,就取决于的抗因子分解强度.

3. 大数因子分解的难度

著名数学家费马(1601—1665)和勒让德((1752—1833)都研究过分解因子的算法,现代某些更好的算法是勒让德方法的扩展.其中,R. Schroeppel算法是好算法中的一类,用此法分解因子仍然需要大约eln nlnln n次运算,其中ln表示自然对数,可见分解n 所需的运算次数与密钥的长度有关,随着密钥长度的增加,分解所需的时间会成指数倍增加.对于不同长度的十进制数n,Schroeppel算法分解n的因子时所需的运算次数如表1所示.

若用1台1 s能进行1亿次因子分解的高速计算机来计算,分解十进制长度为200位的n,其所需时间为3 800 000年.由此可见,对于RSA系统,如果用一个长度为200位(十进制)的n,认为它是比较安全的,如果n的长度更长,因子分解越困难,一般来说,每增加10位二进制数,分解的时间就要加长1倍.密码就越难以破译,加密强度就越高.

不过随着计算机运算速度的提高和并行计算的发展,破解的速度也会同步提高,这时可能要求使用更长的密钥.

RSA的安全性依赖于大数的因子分解,这样攻击RSA系统的难度就是大整数因子分解的难度,一般认为这是一个NPC问题,尽管尚未在理论上证明分解因子的问题一定困难,但千百年来经过众多学者的研究,迄今没有找到一种有效算法,绝大多数数论学家倾向于认为不存在大整数因子分解的多项式算法,因此目前这一破译只能依赖于现代的计算机技术,用程序进行尝试分解,从而对大数的因子分解.不过随着计算机运算速度的提高和并行计算的发展,加上因子分解方法的改进,低位数的密钥的破解已成为可能.因子分解需的时间随密钥长度的增加而成指数指增加,只要n的长度达到一定要求,并且参数p,q和e选取恰当的话,RSA系统是相当安全的.

小知识之RSA公钥介绍:

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

基于多模式加密算法的文件加密保护方案

信息技术和网络通信的发展,尤其是Internet的高速发展,大大加快了全球信息化的进程,同时信息安全方面的问题越来越多,这也引起人们的高度重视。不解决信息安全问题,信息化将不可能健康地发展。数据加密是保证信息安全的基本技术。它以很小的代价为信息提供了一种有效的安全保护,国内外学者对比进行了有效的研究。本文提出了一个基于多模式加密算法的文件加密保护方案来保证计算机中信息的安全。

为了保护文件的保密性和完整性,防止信息被窜改、伪造和假冒,传统的方法是对同一个文件采用单一模式的加密方案。本文提出的文件加密保护方案是对同一文件不同内容用不同加密方法的多模式加密:采用128bits(16Bytes)密钥,使用对称密码算法3DES、IDEA、AES中的一种(可选)和类似CBC(密码分组链接)的加密模式对原文件进行加密以保证数据的安全;另外使用散列算法MD5、SHA1、SHA-256中的一种(可选)对原文件生成散列值,通过校对散列值检测文件是否被更改,从而保证文件的完整性。该方案较传统的方案有更高的安全性。

1 本文涉及的加密和散列函数算法

本文主要使用了对称密码算法3DES、IDEA、AES和类似CBC(密码分组链接)的加密模式,散列算法采用了MD5、SHA1、SHA-256等对原文件生成散列值,通过校对散列值检测文件是否被更改,下面分别进行简单介绍。

1.1 加密算法

DES用56bits密钥将64bits的明文转换成64bits的密文。其中,密钥总长为64bits,另外8bits是奇偶校验位。DES的密钥存在弱密钥、半弱密钥等。实用中较多是它的改进型,即用最小密钥进行三重加密。IDEA算法基于“相异代数群上的混合运算”设计思想。其密钥长度为128bits,是DES密钥的两倍多,分组长度为64bits。一些文献讨论IDEA算法的不足,但目前尚未有进行有效攻击的方法。AES 算法其设计策略是宽轨迹策略(Wide Trail Strategy)。其使用128 、192 或256bits长度的密钥,对于128、192或256bits的加密分组进行加密(密钥跟加密分组长度无须相等共九种组合)。

1.2 密码模式

分组加密算法在加密数据时可以分为四个模式。ECB是最简单和最快的分组密码模式,当然也是最弱的。本文加密文件头使用该模式。在CBC 模式下,每一个分组加密之前必须与前一个分组的密文进行一次XOR 运算,之后再进行加密。因此,每一个区块的加密结果均会受到之前所有分组内容的影响。本文加密文件体系用该模式。

1.3 单向散列算法

本文所用的单向散列函数是消息摘要算法MD5 和安全散列算法SHA。MD5以512bits分组来处理输入的消息,且每一分组又被划分为16个32bits子分组,经过一系列的处理后算法的输出由4个32bits分组组成,将这4个32bits分组级联后将生成一个128bits的散列值。 其运算速度非常快。SHA设计思想和MD5 相似,但是比MD5 具有更长的散列值,因此更能够抵抗攻击。SHA1有160bits散列值。具备扩展转换,并且为产生更快的雪崩效应而将上一轮的输出送至下一轮。SHA-256是SHA1的改进:具有更大的数字指纹、更复杂的非线性函数和压缩函数、每一步均有唯一的加法常数等。因此,SHA-256具有更高的安全性。

2 强加密算法文件加密保护方案的实现

下面介绍该文件加密保护方案的具体实现思想。主要包括文件的加密和解密两个过程。

2.1 文件的加密过程

用户选择好要保护的文件、加密受保护文件头部信息的密码算法、加密原文件的密码算法、散列算法、加密密钥。

使用用户选择的散列算法求出原文件的散列值,然后连同原文件的长度、加密原文件的密码算法、散列算法,这四部分作为受保护文件的头部信息加密后写入受保护文件。头部信息的内容如下:前16Bytes包含了原文件的长度、加密原文件的密码算法、散列算法,接下来的16或32Bytes则是原文件的散列值。其中MD5(128bits)为16Bytes,SHA-256(256bits)为32Bytes,而SHA1(160bits)为16Bytes,剩余的32bits放到前16Bytes空闲的第13-16Bytes中。

使用用户选择的加密受保护文件头部信息的密码算法对头部信息以ECB(电子密码本)模式进行加密。在这里需要注意的是无论选择3DES、IDEA,还是AES,其密钥长度均为128bits。IDEA的密钥长度为128bits,可直接使用;AES的密钥长度和分组长度都是可选的,在本方案中它使用128bits的密钥和分组;对于3DES,它使用了文献[3]介绍的方法,先用128bits的密钥产生三个64bits的密钥,再使用DES算法加密。

接下来,本文使用用户选择的加密原文件的密码算法对原文件进行加密。在加密时用到了一个基于CBC模式,它可以下面的公式表示:Ci=E(PiIV);IV=IVCi;在这个加密模式中,第i个密文分组是由第i个明文分组与初始向量IV异或后再使用具体的密码算法加密得到的,然后IV与第i个密文异或得到新的IV以备对第i+1个明文分组加密时使用。最初的初始向量IV是由受保护文件头部的密码算法产生的子密钥的异或和,不同的密钥产生不同的IV,不同的密码算法产生不同的IV。在本方案中,各个密码算法先产生128bits的IV,在加密原文件时再灵活使用(在加密原文件时,若用户选择了AES算法则128bits的IV可直接使用;若选择了3DES或IDEA,则要将128bits的IV分为前后两个64bits,再将它们异或得到一个64bits的IV来使用)。

各个密码算法产生128bits初始向量IV的方法:AES产生44个子密钥,长度为32bits。将其按顺序分成四组异或得到128bits的初始向量IV,如图2所示。DES先将128bits的密钥分成两个64bits的密钥,生成64个子密钥(DES产生16个子密钥,长度为48bits,在本方案中一个48bits的子密钥被分成两个24bits的子密钥),接着将64个子密钥平均分成四组异或得到128bits的初始向量IV。IDEA产生52个子密钥,长度为16bits。在本方案中,使用前48个子密钥将其合并成24个32bits的分组,然后按顺序分成四组异或得到128bits的初始向量IV。

最后要说明的是,由于DES、IDEA的分组长度为64bits,AES为128bits,若将原文件制作为受保护文件后,受保护文件的长度是64bits的倍数而不是128bits的倍数,那么密码分析者即可确定加密原文件的密码算法不是DES就是IDEA,这样会降低破译的难度。在加密完原文件后,将检测受保护文件的长度是否为128bits的倍数,若不是128bits的倍数则再加上一些随机数据使其为128bits的倍数(是128bits的倍数必然是64bits的倍数,那么密码分析者将不能从文件长度中确定密码算法了)。

2.2 文件的解密过程

(1)软件根据用户提供的解密密钥、受保护文件的头部信息密码算法解密受保护文件的前16Bytes,获取原文件的长度、加密算法、散列算法信息;

(2)根据散列算法产生的散列值的长度读取受保护文件中相应的字节,将其解密得到原文件的散列值H1;

(3)根据解密受保护文件的前16Bytes时得到的原文件加密算法信息和原文件的长度,解密受保护文件剩余部分,将解密得到数据写入文件;

(4)对上一步得到文件用解密受保护文件的前16Bytes时得到的散列算法信息求出该文件的散列值H2;

(5)比较H1与H2,若两者相等则表示文件未被修改;若不等则表示文件已修改。

3 试验结果和该方案的特点

对该方案的实用性进行如下试验:分别对一个txt文件(49.7KB),一个MP3文件(4.95MB),一个exe文件(11.2MB)进行加密和解密试验,使用的散列算法: SHA256,文件头部用3DES加密,文件体分别用3DES、IDEA、AES进行加密,从试验结果可看出该方案的执行时间并没有大幅度的提高,但安全性有很大提高,数据如表1、2(CPU1.1GHz,256MB内存)。

其中,IV是受保护文件头部的密码算法产生的子密钥的异或和。这种加密模式保留了CBC的优点——增加了安全性,而且一旦密文遭到修改其错误将会扩散到修改点以后的全部密文,这样可以更加容易地检测到改动。这些方法较好保证了数据的完整性。在一定程度上将三种密码算法混合起来,增加了破译的难度。密文遭修改后,在解密时该错误会被扩大,可更加容易发现密文被改动。

该方案目前也存在着一些不足:密钥过长(128bits),解密时需提供受保护文件头部信息的密码算法。加密保护文件头部信息时只用了电子密码本模式(ECB),降低了安全性。密文被修改后无法正确解密恢复原文,容错性不理想。

该方案用多种模式加密算法对同一文件进行加密。它是对已有的加密方案的有效改进和整合。虽然该方案还有一些不足之处,但较传统单一模式的加密方案其能更好保证文件的安全性和完整性。

小知识之散列函数概念:

散列函数(或散列算法)是一种从任何一种数据中创建小的数字“指纹”的方法。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用来代表一个短的随机字母和数字组成的字符串。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。

基于安全散列算法的FPGA加密方法

随着现场可编程门阵列(Field Programmable Gate Arrays)技术的迅速发展,对知识产权安全性检测需要越发重要。当配置比特流在FPGA和外部存储器之间传送时,可以被捕获到。利用该比特流,配置其它FPGA器件,就可以未经许可条件下非法拷贝FPGA设计。开发基于FPGA的系统的成本是相当高昂,因此,应当防止未经授权的机构对这些设计和配置进行非法拷贝,以保护设计者的知识产权。在一些高端的FPGA,支持对配置数据流的加密操作。

仅当FPGA中含有相同的密钥时,这些数据流才可工作。但这种加密的方法对更为广泛的、低成本的应用场合不合适。本文利用一种基于安全散列算法(Secure Hash Algorithm,SHA)的方法来防止非法拷贝。它对所有FPGA家族都适用。对于这些低端的、不具备嵌入式比特流加密手段的FPGA,需要在生产过程中使用安全辅助芯片,以有效保护FPGA设计的知识产权。

1工作原理

安全散列算法SHA(Secure Hash Algorithm,SHA)是美国国家标准和技术局发布的国家标准FIPS PUB 180-1,一般称为SHA-1。其可对长度不超过264位的消息产生160位的消息摘要输出,可在NIST的网站上获得该算法的数学原理。IFF(Identification Friend or Foe, IFF)用于确定输入密钥是否正确。

其工作方式如下:

①在FPGA内部构造随机数生成模块,用于产生消息Q,并通过1-Wire总线发送DS2432芯片;

②DS2432内部拥有一个由设计者设定的密钥。由该密钥并结合一个散列函数对消息Q加密,产生一个响应A;

③与此同时,FPGA内部产生一个期望的响应E,判断该期望响应是否与DS2432的真实响应A一致;

④如果E与A吻合,则判断该设计为正版设计;否则判定为盗版设计;

⑤最终,FPGA程序可以对盗版设计做出程序锁止或减少功能。

除了SHA-1本身所具有的安全特性,上述方法的安全特性依赖于密钥,而该密钥既不可能从安全存储器,也不可能从FPGA中读出。更进一步,该密钥不可能在FPGA进行配置时,利用窃听其配置数据流的手段发现。这就如同从一个可执行代码破解操作系统的C++源代码一样,将是一个难于完成的任务。另一个至关重要的安全因素是随机质询机制。一个可预测的质询机制会引发一个可预测的响应结果,因为该结果可被记录,然后由一个微控制器来取代安全存储器。在这种可预测的情况下,微控制器可以让FPGA认为其是一个“友方”电路。而随机的质询机制消除了这种可能性。

2系统设计

根据以上介绍可知,为了满足应用所需的安全性。

HASH算法应满足以下条件:

①不可逆,即从一个HASH结果逆推出与之相关的输入数据在计算上是不可行的。

②防“碰撞”,即使用另外一组输入数据来产生一个相同的HASH结果是不可行的。

③具有极高的雪崩效应,当输入数据的任何变化,都会极大的影响到HASH运算结果。

DS28E01-100和DS2432是Dallas Semiconductor提供的内置SHA-1算法的安全存储器。这些器件的1-Wire接口非常适合此类应用,因为他们只需FPGA的一根引脚就可实现这些功能。

DS2432有以下几个主要的数据部件:

1)64位光刻ROM,

2)64位暂存器,

3)四个32字节的EEPROM页,

4)64位寄存器页,

5)64位密钥存储器,

6)一个512位SHA-1(安全散列算法)引擎。

与此同时,FPGA实现了下述功能,以利用DS2432的安全特性:

①SHA-1 引擎 :这一模块计算SHA-1 算法,进行安全认证。它接收安全存储器通过1 线接口传送来的设计,将其和MAC 结果进行对比。只有当哈希计算结果和安全存储器中SHA-1 引擎的哈希计算结果匹配时,才使能用户设计。

②随机数发生器(RNG):当复位信号置位SHA-1 引擎模块时,RNG 为该模块产生一个随机数。SHA-1 IFF参考设计使用了一个8 位RNG 块。SHA-1 引擎模块处理这一8位随机数,转换成40 位随机数据,进行哈希计算。

③1-Wire接口:这一模块支持FPGA 中参考设计和安全存储器之间的数据传送。1-Wire总线系统由一个总线主机和一个或多个从器件组成。在该应用中,DS2432做为从器件使用,总线主机通常是一个微控制器。对1-Wire总线系统的讨论分为3个部分:硬件配置、处理流程和1-Wire信令(信号类型和时序)。1-Wire协议根据特定时隙中总线的状态来工作,这些特定时隙始于总线主机发出的同步脉冲的下降沿。

对于每个制造单元,设计所有者必须为制造带有嵌入式FPGA产品的一方(生产方)提供一个正确预编程的加密EEPROM。这种一对一的关系限制了生产方可以制造的授权产品的数量。为防止生产方窜改加密EEPROM的内容,可对其中密钥进行写保护。这样就在设计上保证了只有在知道密钥的情况才可更改存储器中的数据。并由此对FPGA产生加密作用,即FPGA可以根据从受SHA-1保护的加密存储器中读出的数据来开启或关闭FPGA中的相应功能。

这种方法的优势如下:

①设计者无需向生产方泄漏SHA-1密钥。

②设计者无需执行系统预编程。

③只有经过设计者授权第三方才可以访问登记的器件。即使捕获了配置数据流,这一FPGA加密方法也能保护FPGA设计不被克隆。在FPGA 中和安全存储器中的哈希计算结果匹配之前,一直禁止用户设计。这一设计加密方法有效保护了FPGA设计人员的知识产权。

小知识之FPGA概念:

FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。

三重DES加密算法原理与实现(二)

③ i=i+1,转到 ①,直到生成16个全部自密钥。

2、 对64位明文分组加密

1) 取得64位明文,不足补齐(补0)

2) 对明文各位按照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

3) 将得到的结果分为左右各32位两部分,称为L0, R0

4) 从i=1开始,循环执行16次下列的加密过程

① 按照下面矩阵E将32位的Ri-1扩展为48位,所得结果称为E( Ri-1),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

161718192021

202122232425

242526272829

28293031321

② 将E( Ri-1)和Ki按位异或

③ 将所得结果分为8个部分,每个部分6位,形成B[1],…B[8]

④ S盒替代。

S盒是8个子矩阵,称为S[1],….S[8],替代如下:将B[i]的第1位和第6位组成一个数称为R,第2、3、4、5位组成一个数称为C,用S[i]中对应的(R,C)中的4位数替换B[i],这样就将原来的48位替换成32位。

⑤ P盒置换 ,按照下面的矩阵重新排列上面的结果

16 7 20 21

29 12 28 17

1 15 23 26

5 18 31 10

2 8 24 14

32 2 3 9

19 13 30 6

22 11 4 25

⑥ 将上一步处理的结果与Li-1按位异或,得到新的Ri,该过程可以简单记为:Ri=Li-1⊕F(Ri-1,Ki)

⑦ i=i+1 转④的第一步,直到完成16次循环

⑧ 进行IP-1置换,将上面得到的L16R16按照下面的矩阵进行置换:

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

加密过程结束,解密过程是用K16,K15,…..K1

3、DES 算法的伪代码表示

C[0]d[0]=PC1(KEY)

FOR I=1 TO 16

C[I]=LS[I](C[I-1])

D[I]=LS[I](D[I-1])

K[I]=PC2(C[I]D[I])

L[0]R[0]=IP(PLAIN BLOCK)

FOR I=1 TO 16

L[I]=R[I-1]

R[I]=L[I-1] ⊕F(R[I-1],K[I])

CIPHER BLOCK=FP-1(L[16]R[16])

四、 算法安全性分析

DES算法具有相当高的复杂性, 密码函数F的非线性性质非常好, 起到的“ 扰乱” 效果非常显著, 并且还遵循了严格雪崩准则和比特独立准则, 这使得要破译它的开销要超过可能获得的利益。再加上其便于理解掌握,经济有效, 因此, 得到了广泛的应用。算法具有极高的安全性, 到目前为止, 除了用穷举搜索法对算法进行攻击外, 还没有发现更有效的办法。而56位长的密钥的穷举空间为256, 这意味着如果一台计算机的速度是每一秒种检测一百万个密钥, 则它搜索完全部密钥就需要将近2300年的时间。而采用三重DES,破译它就更可想而知了。当然, 这并不等于说是不可破解的。而实际上, 随着硬件技术和网络的发展, 其破解的可能性越来越大, 而且, 所需要的时间越来越少。

DES算法的有效密钥长度为56位,因此,在实际应用中,我们应避开使用第8,16,24,……64位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。

小知识之DES算法概念:

DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法

三重DES加密算法原理与实现(一)

随着信息技术的飞速发展,人们对信息系统的安全性,信息传输的保密性要求越来越高。伴随着通信和计算机技术发展起来的现代密码学,不仅在解决信息的机密性、而且在解决信息的完整性、可用性和抗抵赖性方面发挥着不可替代的作用。密码技术使得两个在不安全信道中通信的人,以一种使其敌手不能明白和理解通信内容的方式进行通信,保证了信息的安全。就密码体制而言,一般分为两类,对称密码体制和公钥密码体制。

对称密码体制其特点是发送和接收的双方使用同一密钥,且该密钥必须保证不被泄露;加密算法的安全性依赖于密钥的秘密性,而非算法的秘密性。DES加密算法就是对称加密体制中的佼佼者。1977年1月,美国政府采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES)。DES被授权用于所有公开的和私人的非保密通信场合,后来它又曾被国际标准组织采纳为国际标准。

虽然现在DES已不作为数据加密标准,但至今它仍然被广泛的应用,而且它是一种最有代表性的分组加密体制。因此,研究这一算法的基本原理、设计思想、安全性分析以及实际应用中有关问题,对于掌握分组密码理论和当前的实际应用都是很有意义的。

一、 DES算法原理

DES是一种分组加密算法。明文分组长度为64位。加密得到的密文分组长度为64位。密钥长度64位,8个字节。每一个字节的最高位用于奇偶效验,所以有效密钥长度为56位。其分组加密过程描述如下:①子密钥Ki的生成。②64位的明文经过一个初始置换IP后,被分成左右两半部分,每个部分32位,以L0和R0表示。③进行16轮迭代变换:第i 轮变换将上一轮变换所得到的结果的右半部分与第i个子密钥Ki结合,这个过程称为f函数。第i轮变换结果的左半部分为上一轮变换结果的右半部分(即:Li=Ri-1),其右半部分为上一轮变换结果的左半部与上一轮变换结果的右半部经过F函数处理所的结果的异或:Ri=Li-1⊕F(Ri-1,Ki)。④16轮变换之后左右两部分再连接起来,经过一个初始逆置换IP-1得到密文。 其加密过程如图1所示。

DES的解密算法与加密算法完全相同,只需要将密钥的应用次序与加密时相反应用即可。即解密过程是初始置换函IP数接受长度为64比特的密文输入, 将16个子密钥按照K16到K1的顺序应用与F函数的16轮迭代运算中, 然后将迭代的结果经由末置换函数IP-1得到64位的明文输出。

二、 两个密钥的三重DES

由于DES密钥只有56bit,易于遭受穷举时攻击。作为一种替代加密方案,Tuchman提出使用两个密钥的三重DES加密方法,并在1985年成为美国的一个商用加密标准。该方法使用两个密钥,执行三次DES算法,如图2所示。加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。

采用两个密钥进行三重加密的好处有:①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。②加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。③三重DES具有足够的安全性,目前还没有关于攻破三重DES的报道。

三、Java语言编程实现DES算法

1、 子密钥的生成

1) PC-1变换。

将原密钥的各位按照PC-1矩阵重新排列,这一过程剔除了奇偶校验位。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

2) 将排好的密钥分成两部分,前面28位为C0,后面28位为D0。

3) 从i=1开始,循环执行16次以下步骤得到16个子密钥。

① 对Ci-1和Di-1进行相同位数的循环左移,得到Ci和Di

左移的位数为:

i取数值: 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 22 221

② 连接Ci和Di,按照矩阵PC-2排列选择合适的位,构成子密钥Ki,该过程将56位压缩到48位,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

知识点:

三重DES就是对明文使用两个以上不同的密钥利用相同的加解密算法分别加解密处理三次。

双向遍历加密算法

一、算法原理

我们可以将明文看成一个Byte数组A[N],加解密过程就是对这个数组的运算。首先,我们从头到尾对它进行一次正向的遍历,在遍历的同时将每次遇到的元素的值与前一个元素的值叠加,并写回到数组中。即A[i]+A[i-1]=>A[i](i从2递增到N)。这样执行了遍历相加运算后,除了第一个元素之外,其余所有元素的值都会依赖于它之前的元素的值。不难发现,进行一遍遍历,只能让数组中下标大的元素对下标小的元素形成依赖,而反过来则不成立,而理想中的情况应该是混合型的依赖。为了解决这个缺陷,我们可以使用反向遍历——思路与正向遍历相同,只是起止点对调了:A[i]+A[i+1]=>A[i](i从N-1递减到1)。经过了正反两次叠加遍历,数组中的每个元素的值都变得和其它所有元素的值相关了——由此,本算法也就相应的具备了抗反向分析以及差分分析的能力。

在解决了信息相关性的问题之后,接下来要做的就是将密钥置于在计算过程之中。首先,在正反遍历的求和计算过程中加入了两个长度为一个字节的密钥,分别作用于求和前和求和后的数组元素值,于是,加密过程就变成了:

正向遍历:((A[i]XOR K11)+A[i-1])XOR K12=>A[i]

反向遍历:((A[i] XOR K21)+A[i+1])XOR K22=>A[i]

虽然有了上面的两次遍历过程,但是,不难发现——在每次遍历中,都有一个位于起点的元素的值不会发生变化(正向遍历中的A[1]以及逆向遍历中的A[N])——为了避免这两个元素成为破解的切入点,必须对其进行进一步处理。于是,我们对数组两端的元素再进行一次加密,让它们在正反两次遍历开始时分别作用于相应的起始元素:

正向遍历前:((A[1] XOR K31)+K32=>A[1]

反向遍历前:((A[N] XOR K41)+K42=>A[N]

在完成了加密算法的设计后,接下来就是解密算法——上面的双向遍历叠加过程可以很容易的逆向为双向解密过程,具体见后面的代码,在此不再赘述。同时,不难发现解密密钥就是加密密钥,因此,本加密算法属于对称加密算法。

现在,密钥的复杂度达到了8个字节,即64Bits,能满足一般的加解密要求。为了获得更大的密钥空间,用户完全可以采用多次加密或者多层加密的方法。需要指出的是,由于本算法每次的加密对象都是整个明文,而不是某个定长区块,因此,多次嵌套加密后,所有的密钥信息都会被密文均匀的包容,而不是在固定长度的区块中相互混迭。

二、算法实现

下面是算法的Pascal代码实现(在此,我们使用字符串S作为加解密的对象):

procedure TwoWayEnc(var S:String;const K1,K2:Integer);

var

i,n:Integer;

K11,K12,K21,K22,K31,K32,K41,K42:Byte;

begin

n:=Length(S);

if n=0 then exit;

K11:=K1;K12:=K1 shr 8;

K21:=K1 shr 16;K22:=K1 shr 24;

K31:=K2;K32:=K2 shr 8;

K41:=K2 shr 16;K42:=K2 shr 24;

S[1]:=Char(Byte(S[1])xor K31+K32);

for i:=2 to n do

S[i]:=Char((Byte(S[i])xor K11+Byte(S[i-1]))xor K12);

S[n]:=Char(Byte(S[n])xor K41+K42);

for i:=n-1 downto 1 do

S[i]:=Char((Byte(S[i])xor K21+Byte(S[i+1]))xor K22);

end;

procedure TwoWayDec(var S:String;const K1,K2:Integer);

var

i,n:Integer;

K11,K12,K21,K22,K31,K32,K41,K42:Byte;

begin

n:=Length(S);

if n=0 then exit;

K11:=K1;K12:=K1 shr 8;

K21:=K1 shr 16;K22:=K1 shr 24;

K31:=K2;K32:=K2 shr 8;

K41:=K2 shr 16;K42:=K2 shr 24;

for i:=1 to n-1 do

S[i]:=Char((Byte(S[i])xor K22-Byte(S[i+1]))xor K21);

S[n]:=Char((Byte(S[n])-K42)xor K41);

for i:=n downto 2 do

S[i]:=Char((Byte(S[i])xor K12-Byte(S[i-1]))xor K11);

S[1]:=Char((Byte(S[1])-K32)xor K31);

end;

三、总结

通过实际测试,本算法在主频为2.0GHz的CPU上完成对10MB文本的加密及解密运算只需要0.11秒,平均每个字节的加密或解密运算量小于11个时钟周期,和得到广泛应用的加密算法相比,效率优势非常明显(大多数对称加密算法对每个字节的加解密都需要数十个时钟周期,非对称加密算法的耗时则更长)。基于这一点,完全可以进行多次加密运算以获得更高的安全性,而不会有太大的性能负担。

Twofish加密算法

Twofish是之前Blowfish算法的加密算法,它曾是NIST替换DES算法的高级加密标准(AES)算法的候选算法。
同Blowfish一样,Twofish使用分组加密机制。Twofish使用任何长度为256比特的单个密钥,并声称对如智能卡的微处理器和嵌入在硬件中运行的软件很有效。它允许使用者调节加密速度,密钥安装时间,和编码大小来平衡性能。

由Bruce Schneier的Counterpane Systems设计的Twofish是未注册专利的,免费获取的算法。

确保资料安全 从了解加密算法开始

加密散列函数的帮助下,很多工具软件都可以用来保证计算环境的安全。大部分加密散列函数的设计模式都采用了分块加密算法,针对输入的字符串,产生一个不同于输入内容的独有输出字符串。举例来说,如果你输入字符串“Keep it simple!”并获得“A”作为输出字符串,在这里真正有用的部分是输入其它字符串是都不可能将“A”作为输出字符串。

对于一个加密散列函数来说,输出部分的长度是固定的:无论多长的输入字符串,三个还是三百万个字符,输出字符串都将永远是相同的长度。如前所述,此输出字符串中只要改变一个输入字符就会产生不同的输出字符串(称为“散列”或“校验”)。此外,预测输出特定字符串是不可能的事情。

这些加密散列函数经常在很多方面被利用。通常情况下,它们可以用于密码验证领域。在文件下载领域,它们也经常出现,可以用来方便快速地确定下载的文件是否已经损坏,或者在传递的过程中被人加入了恶意附件。对于采用了OpenPGP工具的包含数字签名的电子邮件来说,散列的信息通常是意味着已经获得了“签名”,可以被其它用户认可。

在众所周知的加密散列函数中用最广泛的可能是MD5和SHA-1。在2005年,MD5和SHA-1中都被发现存在重大的缺陷。SHA-1属于SHA-0的加强版本,但SHA-0中存在的重大缺陷在SHA-1中还是存在的。由于很多人依然认为MD5和SHA-1是足够强大的,并且处于无处不在的使用环境中,所以甚至到今天它们也还是经常被使用。但更多的安全组织尽力选择了更强大的算法,举例来说,SHA-256就是一个不错的替代品,它似乎没有了困扰SHA-0和SHA-1的缺陷。

对于低优先级不需要进行鉴别的应用来说,使用MD5和SHA-1进行加密散列操作不存在任何问题,对于这种情况,通常我们熟悉的名称是“digests”。大多数类Unix操作系统都在默认核心工具包里包含了可以利用MD5和SHA-1进行散列创建和比较的工具。类似的工具也在苹果MacOS下、甚至微软Windows等商业操作系统中出现。而对于包括Perl、PHP、Python以及Ruby在内的大多数高级编程语言来说,这项功能已经被加入标准库中。

附加的数据库与常见的现代编程语言相比,可以提供功能更强大的加密散列函数。这里面不仅仅包括了上面提到的动态编程语言,象C、C++语言、Java和C#(以及其他类型的.NET语言)之类的低级和静态语言也被包括在内了。

在选择下载使用的软件时,你应该首先考虑采用了加密散列算法的对象,这样就会将可能带来的麻烦减少到最低的程度,并且有可能的话,你应该拒绝使用没有利用随处可见的散列工具进行校验的软件。

更重要的是,如果你属于软件和其它可能受到攻击和破坏的文件的提供者,没有任何理由不利用常见的加密散列工具提供良好的校验。一个简单的Perl或者Ruby脚本即可进行验证,并不需要利用C程序进行大量的编译,因为,它仅仅是人们肉眼可读的纯文本字符;但对于可执行二进制文件、jar文件以使用OpenOffice.org字处理软件产生的文件这样的更大、更复杂的文件和文件格式来说,应该始终使用以确保文件的绝对安全。

当然,加密散列函数不能保证下载的软件一定是可以安全使用的。它们能确保的是创建文件和散列的人是值得信赖的。

IDEA加密算法简析

IDEA是International Data Encryption Algorithm的缩写,即国际数据加密算法,它的原型是1990年由瑞士联邦技术学院X.J.Lai和Massey提出的PES。1992年,Lai和Massey对PES进行了改进和强化,产生了IDEA。这是一个非常成功的分组密码,并且广泛的应用在安全电子邮件PGP中。

IDEA加密算法是一个分组长度为64位的分组密码算法,密钥长度为128位,同一个算法即可勇于加密,也可用于解密。这是基于“相异代数群上的混合运算”设计思想,算法运用硬件与软件实现都很容易,而且比DES算法在实现上快的多。IDEA自问世以来,已经经历了大量的详细审查,对密码分析具有很强的抵抗能力,在多种商业产品中被使用。

这种算法是在DES算法的基础上发展起来的,例似与三重DES。发展IDEA也是因为感到DES具有密钥太短等缺点,安全性收到威胁。类似于DES,IDEA算法也是一种数据块加密算法,它涉及了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同之处在于,它采用软件实现和采用硬件实现同样快速。由于IDEA算法是在美国之外提出并发展起来的,避开了美国法律上对加密技术的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,极大地促进了IDEA算法的发展和完善!

IDEA算法的密钥的产生

IDEA加密算法用了52个子密钥(8轮中的每一轮需要6个,其他4个用于输出变换)。首先,将128-位密钥分成8个16-位子密钥。这些事算法的第一批8个子密钥(第一轮6个,第二轮头两个)。然后,密钥向左环移动x位后再分成8个子密钥。开始4个用在第二轮,后面四个用在第三轮。密钥再次向左环移动25位,产生另外8个子密钥,如此进行指导算法结束。

具体是:IDEA总共进行8轮迭代操作,每轮需要6个子密钥,另外还需要4个额外子密钥,所以总共需要52个子密钥,这52个子密钥都是从128位密钥中扩展出来的。

首先把输入的key分成8个16位的子密钥,1-6号子密钥供第一轮加密使用,7-8号子密钥供第二轮使用,然后把这128位密钥循环左移25位,这样key=k26k27k28k29……k24k25。

把新生成的key在分成8个16位的子密钥,1-4号子密钥供第二轮使用,5-8号子密钥供第三轮加密使用。到此,已经得到了16个子密钥,如此继续,当循环左移了5次之后,已经生成了48个子密钥,还有四个额外的子密钥需要生成,再次把key循环左移25位,选取划分出来的8个16位子密钥的前四个作为那四个的额外加密密钥。至此,供加密使用的52个子密钥生成完毕。

输入的64-位数据分组被分成4个16-位子分组:x1,x2,x3和x4。这4个子分组成为算法的第一轮的输入,总共有8轮。在每一轮中,这4个子分组相互相异或,相乘,相加,且与6个16-位子密钥相异或,相乘,相加。在轮与轮间,第二个和第三个子分组交换。最后输出变换中4个子分组与4个子密钥进行运算。

对于IDEA算法的评价:IDEA算法的密钥长度为128位。设计者尽最大努力使该算法不受差分密码分析的影响,数学家已经证明IDEA算法在其8圈迭代的第4圈之后便不受差分密码分析的影响了。假定穷举法攻击有效的话,那么即使设计一种每秒钟可以试验10亿个密钥的专用芯片,并将10亿片这样的芯片用于此项工作,仍需1013年才能解决问题;另一方面,若用1024片这样的芯片,有可能在一天之内找到密钥,不过人们无法找到足够的硅原子来制造这样一台机器。目前,尚无一片公开发表的视图对IDEA进行密码分析的文章。因此,就现在来看,IDEA算法应该是非常安全的!