基本没有,你要是说个轻量级的人物还可以,直接拿Blum出来,估计只有Andrew CYao能与他差不多了。
如果只是说研究方向的话,没有和blum非常像的,在国内的,我知道复旦的赵运磊做零知识不错的。Yao也作复杂性。
当然没什么大的问题!MD5
MD5的典型应用是对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多软件在下载的时候都有一个文件名相同,文件扩展名为md5的文件,在这个文件中通常只有一行文本,大致结构如:
MD5 (tanajiyatargz) = 0ca175b9c0f726a831d895e269332461
这就是tanajiyatargz文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。为了让读者朋友对MD5的应用有个直观的认识,笔者以一个比方和一个实例来简要描述一下其工作过程:
大家都知道,地球上任何人都有自己独一无二的指纹,这常常成为公安机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。
我们常常在某些软件下载站点的某软件信息中看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如Windows MD5 Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面。
MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹),以防止被“篡改”。举个例子,你将一段话写在一个叫 readmetxt文件中,并对这个readmetxt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。
MD5还广泛用于 *** 作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方。如在UNIX系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:你可以用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。
正是因为这个原因,现在被黑客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用MD5程序计算出这些字典项的MD5值,然后再用目标的MD5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 Bytes),同时密码只能是字母和数字,共26+26+10=62个字符,排列组合出的字典的项数则是P(62,1)+P(62,2)…+P(62,8),那也已经是一个很天文的数字了,存储这个字典就需要TB级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码MD5值的情况下才可以。这种加密技术被广泛的应用于UNIX系统中,这也是为什么UNIX系统比一般 *** 作系统更为坚固一个重要原因。
[编辑本段]算法描述
对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N512+448,即N64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息的位长=N512+448+64=(N+1)512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
MD5中有四个32位被称作链接变量(Chaining Variable)的整数参数,他们分别为:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。
当设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次 *** 作。每次 *** 作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
以一下是每次 *** 作中用到的四个非线性函数(每轮一个)。
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是与,|是或,~是非,^是异或)
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。
F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶 *** 作符。
假设Mj表示消息的第j个子分组(从0到15),<<
FF(a, b, c, d, Mj, s, ti)表示 a = b + ((a + F(b, c, d) + Mj + ti) << s)
GG(a, b, c, d, Mj, s, ti)表示 a = b + ((a + G(b, c, d) + Mj + ti) << s)
HH(a, b, c, d, Mj, s, ti)表示 a = b + ((a + H(b, c, d) + Mj + ti) << s)
II(a, b, c, d, Mj, s, ti)表示 a = b + ((a + I(b, c, d) + Mj + ti) << s)
这四轮(64步)是:
第一轮
FF(a, b, c, d, M0, 7, 0xd76aa478)
FF(d, a, b, c, M1, 12, 0xe8c7b756)
FF(c, d, a, b, M2, 17, 0x242070db)
FF(b, c, d, a, M3, 22, 0xc1bdceee)
FF(a, b, c, d, M4, 7, 0xf57c0faf)
FF(d, a, b, c, M5, 12, 0x4787c62a)
FF(c, d, a, b, M6, 17, 0xa8304613)
FF(b, c, d, a, M7, 22, 0xfd469501)
FF(a, b, c, d, M8, 7, 0x698098d8)
FF(d, a, b, c, M9, 12, 0x8b44f7af)
FF(c, d, a, b, M10, 17, 0xffff5bb1)
FF(b, c, d, a, M11, 22, 0x895cd7be)
FF(a, b, c, d, M12, 7, 0x6b901122)
FF(d, a, b, c, M13, 12, 0xfd987193)
FF(c, d, a, b, M14, 17, 0xa679438e)
FF(b, c, d, a, M15, 22, 0x49b40821)
第二轮
GG(a, b, c, d, M1, 5, 0xf61e2562)
GG(d, a, b, c, M6, 9, 0xc040b340)
GG(c, d, a, b, M11, 14, 0x265e5a51)
GG(b, c, d, a, M0, 20, 0xe9b6c7aa)
GG(a, b, c, d, M5, 5, 0xd62f105d)
GG(d, a, b, c, M10, 9, 0x02441453)
GG(c, d, a, b, M15, 14, 0xd8a1e681)
GG(b, c, d, a, M4, 20, 0xe7d3fbc8)
GG(a, b, c, d, M9, 5, 0x21e1cde6)
GG(d, a, b, c, M14, 9, 0xc33707d6)
GG(c, d, a, b, M3, 14, 0xf4d50d87)
GG(b, c, d, a, M8, 20, 0x455a14ed)
GG(a, b, c, d, M13, 5, 0xa9e3e905)
GG(d, a, b, c, M2, 9, 0xfcefa3f8)
GG(c, d, a, b, M7, 14, 0x676f02d9)
GG(b, c, d, a, M12, 20, 0x8d2a4c8a)
第三轮
HH(a, b, c, d, M5, 4, 0xfffa3942)
HH(d, a, b, c, M8, 11, 0x8771f681)
HH(c, d, a, b, M11, 16, 0x6d9d6122)
HH(b, c, d, a, M14, 23, 0xfde5380c)
HH(a, b, c, d, M1, 4, 0xa4beea44)
HH(d, a, b, c, M4, 11, 0x4bdecfa9)
HH(c, d, a, b, M7, 16, 0xf6bb4b60)
HH(b, c, d, a, M10, 23, 0xbebfbc70)
HH(a, b, c, d, M13, 4, 0x289b7ec6)
HH(d, a, b, c, M0, 11, 0xeaa127fa)
HH(c, d, a, b, M3, 16, 0xd4ef3085)
HH(b, c, d, a, M6, 23, 0x04881d05)
HH(a, b, c, d, M9, 4, 0xd9d4d039)
HH(d, a, b, c, M12, 11, 0xe6db99e5)
HH(c, d, a, b, M15, 16, 0x1fa27cf8)
HH(b, c, d, a, M2, 23, 0xc4ac5665)
第四轮
II(a, b, c, d, M0, 6, 0xf4292244)
II(d, a, b, c, M7, 10, 0x432aff97)
II(c, d, a, b, M14, 15, 0xab9423a7)
II(b, c, d, a, M5, 21, 0xfc93a039)
II(a, b, c, d, M12, 6, 0x655b59c3)
II(d, a, b, c, M3, 10, 0x8f0ccc92)
II(c, d, a, b, M10, 15, 0xffeff47d)
II(b, c, d, a, M1, 21, 0x85845dd1)
II(a, b, c, d, M8, 6, 0x6fa87e4f)
II(d, a, b, c, M15, 10, 0xfe2ce6e0)
II(c, d, a, b, M6, 15, 0xa3014314)
II(b, c, d, a, M13, 21, 0x4e0811a1)
II(a, b, c, d, M4, 6, 0xf7537e82)
II(d, a, b, c, M11, 10, 0xbd3af235)
II(c, d, a, b, M2, 15, 0x2ad7d2bb)
II(b, c, d, a, M9, 21, 0xeb86d391)
常数ti可以如下选择:
在第i步中,ti是4294967296abs(sin(i))的整数部分,i的单位是弧度。(4294967296等于2的32次方)
所有这些完成之后,将A、B、C、D分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是A、B、C和D的级联。
当你按照我上面所说的方法实现MD5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。
MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
d174ab98d277d9f5a5611c2c9f419d9f
具体的一个MD5实现
/
md5 -- compute and check MD5 message digest
this version only can calculate the char string
MD5 (Message-Digest algorithm 5) is a widely used, partially
insecure cryptographic hash function with a 128-bit hash value
Author: redraiment
Date: Aug 27, 2008
Version: 016
/
#include <stdlibh>
#include <stringh>
#include <stdioh>
#include <mathh>
#define SINGLE_ONE_BIT 0x80
#define BLOCK_SIZE 512
#define MOD_SIZE 448
#define APP_SIZE 64
#define BITS 8
// MD5 Chaining Variable
#define A 0x67452301UL
#define B 0xEFCDAB89UL
#define C 0x98BADCFEUL
#define D 0x10325476UL
// Creating own types
#ifdef UINT64
# undef UINT64
#endif
#ifdef UINT32
# undef UINT32
#endif
typedef unsigned long long UINT64;
typedef unsigned long UINT32;
typedef unsigned char UINT8;
typedef struct
{
char message;
UINT64 length;
}STRING;
const UINT32 X[4][2] = {{0, 1}, {1, 5}, {5, 3}, {0, 7}};
// Constants for MD5 transform routine
const UINT32 S[4][4] = {
{ 7, 12, 17, 22 },
{ 5, 9, 14, 20 },
{ 4, 11, 16, 23 },
{ 6, 10, 15, 21 }
};
// F, G, H and I are basic MD5 functions
UINT32 F( UINT32 X, UINT32 Y, UINT32 Z )
{
return ( X & Y ) | ( ~X & Z );
}
UINT32 G( UINT32 X, UINT32 Y, UINT32 Z )
{
return ( X & Z ) | ( Y & ~Z );
}
UINT32 H( UINT32 X, UINT32 Y, UINT32 Z )
{
return X ^ Y ^ Z;
}
UINT32 I( UINT32 X, UINT32 Y, UINT32 Z )
{
return Y ^ ( X | ~Z );
}
// rotates x left s bits
UINT32 rotate_left( UINT32 x, UINT32 s )
{
return ( x << s ) | ( x >> ( 32 - s ) );
}
// Pre-processin
UINT32 count_padding_bits ( UINT32 length )
{
UINT32 div = length BITS / BLOCK_SIZE;
UINT32 mod = length BITS % BLOCK_SIZE;
UINT32 c_bits;
if ( mod == 0 )
c_bits = MOD_SIZE;
else
c_bits = ( MOD_SIZE + BLOCK_SIZE - mod ) % BLOCK_SIZE;
return c_bits / BITS;
}
STRING append_padding_bits ( char argv )
{
UINT32 msg_length = strlen ( argv );
UINT32 bit_length = count_padding_bits ( msg_length );
UINT64 app_length = msg_length BITS;
STRING string;
stringmessage = (char )malloc(msg_length + bit_length + APP_SIZE / BITS);
// Save message
strncpy ( stringmessage, argv, msg_length );
// Pad out to mod 64
memset ( stringmessage + msg_length, 0, bit_length );
stringmessage [ msg_length ] = SINGLE_ONE_BIT;
// Append length (before padding)
memmove ( stringmessage + msg_length + bit_length, (char )&app_length, sizeof( UINT64 ) );
stringlength = msg_length + bit_length + sizeof( UINT64 );
return string;
}
int main ( int argc, char argv[] )
{
STRING string;
UINT32 w[16];
UINT32 chain[4];
UINT32 state[4];
UINT8 r[16];
UINT32 ( auxi[ 4 ])( UINT32, UINT32, UINT32 ) = { F, G, H, I };
int roundIdx;
int argIdx;
int sIdx;
int wIdx;
int i;
int j;
if ( argc < 2 )
{
fprintf ( stderr, "usage: %s string \n", argv[ 0 ] );
return EXIT_FAILURE;
}
for ( argIdx = 1; argIdx < argc; argIdx++ )
{
string = append_padding_bits ( argv[ argIdx ] );
// MD5 initialization
chain[0] = A;
chain[1] = B;
chain[2] = C;
chain[3] = D;
for ( j = 0; j < stringlength; j += BLOCK_SIZE / BITS)
{
memmove ( (char )w, stringmessage + j, BLOCK_SIZE / BITS );
memmove ( state, chain, sizeof(chain) );
for ( roundIdx = 0; roundIdx < 4; roundIdx++ )
{
wIdx = X[ roundIdx ][ 0 ];
sIdx = 0;
for ( i = 0; i < 16; i++ )
{
// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4
// Rotation is separate from addition to prevent recomputation
state[sIdx] = state [ (sIdx + 1) % 4 ] +
rotate_left ( state[sIdx] +
( auxi[ roundIdx ] )
( state[(sIdx+1) % 4], state[(sIdx+2) % 4], state[(sIdx+3) % 4]) +
w[ wIdx ] +
(UINT32)floor( (1ULL << 32) fabs(sin( roundIdx 16 + i + 1 )) ),
S[ roundIdx ][ i % 4 ]);
sIdx = ( sIdx + 3 ) % 4;
wIdx = ( wIdx + X[ roundIdx ][ 1 ] ) & 0xF;
}
}
chain[ 0 ] += state[ 0 ];
chain[ 1 ] += state[ 1 ];
chain[ 2 ] += state[ 2 ];
chain[ 3 ] += state[ 3 ];
}
memmove ( r + 0, (char )&chain[0], sizeof(UINT32) );
memmove ( r + 4, (char )&chain[1], sizeof(UINT32) );
memmove ( r + 8, (char )&chain[2], sizeof(UINT32) );
memmove ( r + 12, (char )&chain[3], sizeof(UINT32) );
for ( i = 0; i < 16; i++ )
printf ( "%02x", r[i] );
putchar ( '\n' );
}
return EXIT_SUCCESS;
}
/ 以上程序可以在任意一款支持ANSI C的编译器上编译通过 /
[编辑本段]修改MD5加密 提高网站安全
也许提到MD5时大家都很熟,但你真的是这样吗?了解其是如何进行散列的实际过程吗?虽然我们一般的人是不用这样去寻根问底,要用的时候直接去下载别人已编好的程序用就得了。
由于算法大多的人都是知道的,所以现在网上有很多破解MD5散列值的工具,但我们搞安全的完全可以发挥我们的想象力充分地调动自己的积极性,是否想过自己也重改造一个MD5的算法呢?让现在所有的破解MD5的工具下课呢?因为MD5在我们网络中实在是用得太广了,各网站要保存用户的资料,但明文保存时又怕万一被哪个攻击者攻入网站,下载了数据库,所以我们常用MD5进行散列各种重要的资料。但是现在有好多工具是可以进行简单的破解的。
我们先来了解一下MD5这个散列算法,然后我再一个例子说明如何提高了网站的安全性。
下边我只是简单的说明,x与y的所在空间就不作介绍了(x∈A,y∈B)。我们来看看一个散列算法一般是要满足下面三个条件之一:
1、 H是一个单向函数。即对几乎所有的H(x)=y,已知y要求x,则在计算上是不可行的。
2、 已知x,找x′∈A,使H(x)=H(x′)在计算上是不可能的,这也就是弱无碰撞性。
3、 找一对x和x‘, 而x≠x’,使H(x)=H(x′)在计算上也是不可行的,这也就是强无碰撞性。
这样就称为安全保密的Hash函数。下边是对消息的散列过程:
由上边的表大家也许看到了左边是不是要求输入一个初始向量IV,这也就是今天我说明的关键地方,这个初始向量要MD5算法中是由A、B、C、D四个缓冲区寄存器存放的,而每一个寄存器是32比特。它们的初始值是:
a = 0x67452301
b = 0x EFCDAB89
c = 0x 98BADCFE
d = 0x 10325476
在这我们可以看到这四个16进制的值,这也可看做是一种初始的种子,如果大家对MD5的算法过程清楚的话,我们可知在这过程在主要是一些异或、求模等的运算,对每一个分组512比特消息进行处理的,而每一分组都进行416次的运算,所以我有个大胆的想法,只是我们把初始值进行稍微的改变的话,那不就是变成另外的MD5散列算法了吗!我们知道A、B、C、D四个值共是16进制的48=32位,那么我们都可计算可能被破解的概率空间,如果动得更多的话,那被破解的可能性也就越小。只要我们改变一位的话,而同时我们也不必改动算法的其它部分,从而也不会对我们的程序进行多大的变动。是不是就找到一种新的散列算法了呢,其实,对散列算法有研究的就可知,美国的信息压缩标准SHA也是与MD5有点相似(主要是指思路)。
现在介绍了这些有关的MD5知识后,我们来看看如何修改我们网站管理程序的源码,这里我以国内有名的动网论坛DVBBS70说明。
我们都知道动网论坛的用户的数据如密码,提问的问题的答案是以MD5散列的,通常攻击者就是下载了数据库来进行破解而得到管理员的密码的,默认的是放在这个路径下的:bbs\data\dvbbs7mdb 而我们一般是采用的是修改数据库的名字,同时相应的修改一下connasp中的相关设置。
现在我们的方法是你找到这个文件\inc\md5asp。这个页面就是我们进行散列处理的程序,只是在这修改一下的话,我们就产生了自己的新MD5散列算法。然后以记事本的方式打开它,找到这个地方。
看到了吧,a、b、c、d这四个值了吧,就是我们前边谈的哟,看你如何改了。随你的便了吧!但我建议是你最好改一位就可了,还是尽量少改吧。如你可把a = 0x67452301改为a = 0x67452300这样你就用了一个与众不同的MD5算法呢,这样,哪怕就是你的数据库被下载了,你也可以放心的用了。让他们的破解MD5的工具见鬼去吧!
但是我要说明的是,了解MD5过程的人可能会问,你这样改变会影响 *** 作吗?这个问题专家可能都很难把它论证。同时我给大家要说的是,MD5是征对所有的信息的,而我们这样的改变,仅仅用在一个网站上的几千个,上万个用户的话,应该是没有多大问题的,但是我们要从数学上证明它这个改变后也能满足文章开始时说的三个条件的话,确实有一定的难度,这就让读者去讨论一下吧。
特别说明:此种改变只能用于在刚开始建站时才可,如果你中途改变的话就会出现问题。
[编辑本段]MD5的破解
2004年8月17日的美国加州圣巴巴拉的国际密码学会议(Crypto’2004)上,来自中国山东大学的王小云教授做了破译MD5、HAVAL-128、 MD4和RIPEMD算法的报告,公布了MD系列算法的破解结果。宣告了固若金汤的世界通行密码标准MD5的堡垒轰然倒塌,引发了密码学界的轩然大波。
令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云教授又破解了另一国际密码SHA-1。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。
MD5破解工程权威网站是为了公开征集专门针对MD5的攻击而设立的,网站于2004年8月17日宣布:“中国研究人员发现了完整MD5算法的碰撞;Wang, Feng, Lai与Yu公布了MD5、MD4、HAVAL-128、RIPEMD-128几个 Hash函数的碰撞。这是近年来密码学领域最具实质性的研究进展。使用他们的技术,在数个小时内就可以找到MD5碰撞。……由于这个里程碑式的发现,MD5CRK项目将在随后48小时内结束”。
在2004年8月之前,国际密码学界对王小云这个名字并不熟悉。2004年8月,在美国加州圣芭芭拉召开的国际密码大会上,并没有被安排发言的王小云教授拿着自己的研究成果找到会议主席,没想到慧眼识珠的会议主席破例给了她15分钟时间来介绍自己的成果,而通常发言人只被允许有两三分钟的时间。王小云及其研究同工展示了MD5、SHA-0及其他相关杂凑函数的杂凑冲撞。所谓杂凑冲撞指两个完全不同的讯息经杂凑函数计算得出完全相同的杂凑值。根据鸽巢原理,以有长度限制的杂凑函数计算没有长度限制的讯息是必然会有冲撞情况出现的。可是,一直以来,电脑保安专家都认为要任意制造出冲撞需时太长,在实际情况上不可能发生,而王小云等的发现可能会打破这个必然性。就这样,王小云在国际会议上首次宣布了她及她的研究小组近年来的研究成果——对MD4、MD5、HAVAL-128和RIPEMD等四个著名密码算法的破译结果。
在公布到第三个成果的时候,会场上已经是掌声四起,报告不得不一度中断。报告结束后,所有与会专家对他们的突出工作报以长时间的掌声,有些学者甚至起立鼓掌以示他们的祝贺和敬佩。由于版本问题,作者在提交会议论文时使用的一组常数和先行标准不同,在发现这一问题之后,王小云教授立即改变了那个常数,在很短的时间内就完成了新的数据分析,这段有惊无险的小插曲更证明了他们论文的信服力,攻击方法的有效性,验证了研究工作的成功。
令世界顶尖密码学家想象不到的是,破解MD5之后,2005年2月,王小云与其同事提出SHA-1杂凑函数的杂凑冲撞。因为SHA-1在美国等国际社会有更加广泛的应用,密码被破的消息一出,在国际社会的反响可谓石破天惊。换句话说,王小云的研究成果表明了从理论上讲电子签名可以伪造,必须及时添加限制条件,或者重新选用更为安全的密码标准,以保证电子商务的安全。
2005年8月,王小云、姚期智,以及姚期智妻子姚储枫(即为Knuth起名高德纳的人)联手于国际密码讨论年会尾声部份提出SHA-1杂凑函数杂凑冲撞演算法的改良版。此改良版使破解SHA-1时间缩短。
2006年6月8日,王小云教授于中国科学院第13次院士大会和中国工程院第8次院士大会上以“国际通用Hash函数的破解”获颁陈嘉庚科学奖信息技术科学奖
这个不好说,什么情况都可能不是吗。
RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。
解密者拥有私钥,并且将由私钥计算生成的公钥发布给加密者。加密都使用公钥进行加密,并将密文发送到解密者,解密者用私钥解密将密文解码为明文。
以甲要把信息发给乙为例,首先确定角色:甲为加密者,乙为解密者。首先由乙随机确定一个KEY,称之为密匙,将这个KEY始终保存在机器B中而不发出来;然后,由这个 KEY计算出另一个KEY,称之为公匙。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给甲,甲收到公钥后,利用公钥对信息加密,并把密文通过网络发送到乙,最后乙利用已知的私钥,就对密文进行解码了。以上就是RSA算法的工作流程。
算法实现过程为:
1 随意选择两个大的质数p和q,p不等于q,计算N=pq。
2 根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)。
3 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。
4 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。
5 将p和q的记录销毁。
以上内容中,(N,e)是公钥,(N,d)是私钥。
下面讲解RSA算法的应用。
RSA的公钥和私钥是由KeyPairGenerator生成的,获取KeyPairGenerator的实例后还需要设置其密钥位数。设置密钥位数越高,加密过程越安全,一般使用1024位。如下代码:
[代码]java代码:
1KeyPairGenerator keyPairGen = KeyPairGeneratorgetInstance(RSA);
2// 密钥位数
3keyPairGeninitialize(1024);
公钥和私钥可以通过KeyPairGenerator执行generateKeyPair()后生成密钥对KeyPair,通过KeyPairgetPublic()和KeyPairgetPrivate()来获取。如下代码:
[代码]java代码:
1// 动态生成密钥对,这是当前最耗时的 *** 作,一般要2s以上。
2KeyPair keyPair = keyPairGengenerateKeyPair();
3// 公钥
4PublicKey publicKey = (RSAPublicKey) keyPairgetPublic();
5// 私钥
6PrivateKey privateKey = (RSAPrivateKey) keyPairgetPrivate();
7byte[] publicKeyData = publicKeygetEncoded();
8byte[] privateKeyData = publicKeygetEncoded();
公钥和私钥都有它们自己独特的比特编码,可以通过getEncoded()方法获取,返回类型为byte[]。通过byte[]可以再度将公钥或私钥还原出来。具体代码如下:
[代码]java代码:
01// 通过公钥byte[]将公钥还原,适用于RSA算法
02public static PublicKey getPublicKey(byte[] keyBytes) throws
03NoSuchAlgorithmException,InvalidKeySpecException {
04 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
05 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
06 PublicKey publicKey = keyFactorygeneratePublic(keySpec);
07 return publicKey;
08}
09// 通过私钥byte[]将公钥还原,适用于RSA算法
10public static PrivateKey getPrivateKey(byte[] keyBytes) throws
11NoSuchAlgorithmException,InvalidKeySpecException {
12 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
13 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
14 PrivateKey privateKey = keyFactorygeneratePrivate(keySpec);
15 return privateKey;
16}
在上文讲到的RSA算法实现过程中提到(N,e)是公钥,(N,d)是私钥。既然已经获取到了PublicKey和PrivateKey了,那如何取到N、e、d这三个值呢。要取到这三个值,首先要将PublicKey和PrivateKey强制转换成RSAPublicKey和RSAPrivateKey。共同的N值可以通过getModulus()获取。执行RSAPublicKeygetPublicExponent()可以获取到公钥中的e值,执行RSAPrivateKeygetPrivateExponent()可以获取私钥中的d值。这三者返回类型都是BigInteger。代码如下:
[代码]java代码:
01// 打印公钥信息
02public static void printPublicKeyInfo(PublicKey key){
03RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
04Logd(MainActivityTAG, "RSAPublicKey:");
05Logd(MainActivityTAG, "Moduluslength=" +
06rsaPublicKeygetModulus()bitLength());
07Logd(MainActivityTAG, "Modulus=" +
08rsaPublicKeygetModulus()toString());
09Logd(MainActivityTAG, "PublicExponentlength=" +
10rsaPublicKeygetPublicExponent()bitLength());
11Logd(MainActivityTAG, "PublicExponent=" +
12rsaPublicKeygetPublicExponent()toString());
13}
14
15// 打印私钥信息
16public static void printPublicKeyInfo(PrivateKey key){
17RSAPrivateKey rsaPublicKey = (RSAPrivateKey) privateKey;
18Logd(MainActivityTAG, "RSAPrivateKey:");
19Logd(MainActivityTAG, "Moduluslength=" +
20rsaPrivateKeygetModulus()bitLength());
21Logd(MainActivityTAG, "Modulus=" +
22rsaPrivateKeygetModulus()toString());
23Logd(MainActivityTAG, "PublicExponentlength=" +
24rsaPrivateKeygetPrivateExponent()bitLength());
25Logd(MainActivityTAG, "PublicExponent=" +
26rsaPrivateKeygetPrivateExponent()toString());
27}
由于程序中动态生成KeyPair对明文加密后生成的密文是不可测的,所以在实际开发中通常在生成一个KeyPair后将公钥和私钥的N、e、d这三个特征值记录下来,在真实的开发中使用这三个特征值再去将PublicKey和PrivateKey还原出来。还原方法如下:
[代码]java代码:
01// 使用N、e值还原公钥
02public static PublicKey getPublicKey(String modulus, String
03publicExponent)
04 throws NoSuchAlgorithmException, InvalidKeySpecException {
05 BigInteger bigIntModulus = new BigInteger(modulus);
06 BigInteger bigIntPrivateExponent = new BigInteger(publicExponent);
07 RSAPublicKeySpec keySpec = new RSAPublicKeySpec(bigIntModulus,
08bigIntPrivateExponent);
09 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
10 PublicKey publicKey = keyFactorygeneratePublic(keySpec);
11 return publicKey;
12}
13
14// 使用N、d值还原公钥
15public static PrivateKey getPrivateKey(String modulus, String
16privateExponent)
17 throws NoSuchAlgorithmException, InvalidKeySpecException {
18 BigInteger bigIntModulus = new BigInteger(modulus);
19 BigInteger bigIntPrivateExponent = new BigInteger(privateExponent);
20 RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(bigIntModulus,
21 bigIntPrivateExponent);
22 KeyFactory keyFactory = KeyFactorygetInstance("RSA");
23 PrivateKey privateKey = keyFactorygeneratePrivate(keySpec);
24 return privateKey;
25}
公钥和私钥都具备后,就可以使用加解密的工具类javaxcryptoCipher对明文和密文进行处理了。与所有的引擎类一样,可以通过调用Cipher类中的getInstance(String transformation)静态工厂方法得到Cipher对象。该方法中的参数描述了由指定输入产生输出所进行的 *** 作或 *** 作集合,可以是下列两种形式之一:“algorithm/mode/padding”或“algorithm”。例如下面的例子就是有效的transformation形式:"DES/CBC/PKCS5Padding"或"DES"。如果没有指定模式或填充方式,就使用特定提供者指定的默认模式或默认填充方式。
Cipher的加密和解密方式所调用的方法和过程都一样,只是传参不同的区别。
亲,您好!使用不安全随机数生成初始密码是可行的,但是不推荐这样做,因为这样的密码很容易被破解。最佳的做法是使用一个安全的随机数生成器来生成一个复杂的密码,这样的密码可以提供更高的安全性,并且更难被破解。此外,还应该避免使用常见的单词或词组,而应该使用一些混合的大小写字母、数字和特殊字符来创建一个复杂的密码。
混沌流密码研究
胡汉平1 董占球2
(华中科技大学图像识别与人工智能研究所/图像信息处理与智能控制教育部重点实验室
中国科学院研究生院,)
摘要:在数字化混沌系统和基于混沌同步的保密通信系统的研究中存在一些亟待解决的重要问题:数字化混沌的特性退化,混沌时间序列分析对混沌系统安全性的威胁等,已严重影响着混沌流密码系统的实用化进程。为此,提出了通过变换的误差补偿方法克服数字混沌的特性退化问题;构建混沌编码模型完成对混沌序列的编码、采样,由此得到满足均匀、独立分布的驱动序列;引入非线性变换,以抵抗对混沌流密码系统安全性的威胁。
关键词:混沌流密码系统;特性退化;非线性变换;混沌时间序列分析
1 引言
随着以计算机技术和网络通信技术为代表的信息技术的不断发展和迅速普及,通信保密问题日益突出。信息安全问题已经成为阻碍经济持续稳定发展和威胁国家安全的一个重要问题。众所周知,密码是信息安全的核心,设计具有自主知识产权的新型高性能的密码体制是目前最亟待解决的重要问题。
混沌是确定性系统中的一种貌似随机的运动。混沌系统都具有如下基本特性:确定性、有界性、对初始条件的敏感性、拓扑传递性和混合性、宽带性、快速衰减的自相关性、长期不可预测性和伪随机性[1],正是因为混沌系统所具有的这些基本特性恰好能够满足保密通信及密码学的基本要求:混沌动力学方程的确定性保证了通信双方在收发过程或加解密过程中的可靠性;混沌轨道的发散特性及对初始条件的敏感性正好满足Shannon提出的密码系统设计的第一个基本原则――扩散原则;混沌吸引子的拓扑传递性与混合性,以及对系统参数的敏感性正好满足Shannon提出的密码系统设计的第二个基本原则――混淆原则;混沌输出信号的宽带功率谱和快速衰减的自相关特性是对抗频谱分析和相关分析的有利保障,而混沌行为的长期不可预测性是混沌保密通信安全性的根本保障等。因此,自1989年RMathews, DWheeler, LMPecora和Carroll等人首次把混沌理论使用到序列密码及保密通信理论以来,数字化混沌密码系统和基于混沌同步的保密通信系统的研究已引起了相关学者的高度关注[2]。虽然这些年的研究取得了许多可喜的进展,但仍存在一些重要的基本问题尚待解决。
11 数字混沌的特性退化问题
在数字化的混沌密码系统的研究方向上,国内外学者已经提出了一些比较好的数字混沌密码系统及其相应的密码分析方法:文献[3]提出基于帐篷映射的加解密算法;文献[4]1998年Fridrich通过定义一种改进的二维螺旋或方形混沌映射来构造一种新的密码算法;文献[5,6]提出把混沌吸引域划分为不同的子域,每一子域与明文一一对应,把混沌轨道进入明文所对应的混沌吸引域子域的迭代次数作为其密文;在文献[7]中,作者把一个字节的不同比特与不同的混沌吸引子联系起来实现加/解密;文献[8]较为详细地讨论了通过混沌构造S盒来设计分组密码算法的方法;文献[9,10]给出了混沌伪随机数产生的产生方法;英国的SafeChaos公司将混沌用于公钥密码体制,推出了CHAOS+Public Key (v423)系统[11];等等。但是,这些数字混沌系统一般都是在计算机或其它有限精度的器件上实现的,由此可以将混沌序列生成器归结为有限自动机来描述,在这种条件下所生成的混沌序列会出现特性退化:短周期、强相关以及小线性复杂度等[12-15],即数字混沌系统与理想的实值混沌系统在动力学特性上存在相当大的差异。它所带来的混沌密码系统安全的不稳定性是困扰混沌密码系统进入实用的重要原因[16]。尽管有人指出增加精度可以减小这一问题所造成的后果,但其代价显然是非常大的。
12 对混沌流密码系统的相空间重构分析
目前,对混沌保密通信系统的分析工作才刚刚起步,主要方法有:统计分析(如周期及概率分布分析和相关分析等)、频谱分析(包括傅立叶变换和小波变换等)和混沌时间序列分析[17]。前两者都是传统的信号分析手段,在此就不再赘述,而混沌时间序列是近20年来发展的一门扎根于非线性动力学和数值计算的新兴学科方向。
从时间序列出发研究混沌系统,始于Packard等人于1980年提出的相空间重构(Phase Space Reconstruction)理论。众所周知,对于决定混沌系统长期演化的任一变量的时间演化,均包含了混沌系统所有变量长期演化的信息(亦称为全息性),这是由混沌系统的非线性特点决定的,这也是混沌系统难以分解和分析的主要原因。因此,理论上可以通过决定混沌系统长期演化的任一单变量的时间序列来研究混沌系统的动力学行为,这就是混沌时间序列分析的基本思想。
混沌时间序列分析的目的是通过对混沌系统产生的时间序列进行相空间重构分析,利用数值计算估计出混沌系统的宏观特征量,从而为进一步的非线性预测[18](包括基于神经网络或模糊理论的预测模型)提供模型参数,这基本上也就是目前对混沌保密通信系统进行分析或评价的主要思路。描述混沌吸引子的宏观特征量主要有:Lyapunov指数(系统的特征指数)、Kolmogorov熵(动力系统的混沌水平)和关联维(系统复杂度的估计)等[17]。而这些混沌特征量的估计和Poincare截面法都是以相空间重构以及FTakens的嵌入定理为基础的,由此可见相空间重构理论在混沌时间序列分析中的重大意义。
13 对混沌流密码系统的符号动力学分析
我们在以往的实验分析工作中都是针对混沌密码系统的统计学特性进行研究的,如周期性、平衡性、线性相关性、线性复杂度、混淆和扩散特性等,即使涉及到非线性也是从混沌时间序列分析(如相图分析或分数维估计等)的角度出发进行研究的。然而,符号动力学分析表明,混沌密码系统的非线性动力学分析同样非常主要,基于实用符号动力学的分析可能会很快暴露出混沌编码模型的动力学特性。基于Gray码序数和单峰映射的符号动力学之间的关系,文献[20]提出了一种不依赖单峰映射的初始条件而直接从单峰映射产生的二值符号序列来进行参数估计的方法。分析结果表明,基于一般混沌编码模型的密码系统并不如人们想象的那么安全,通过对其产生的一段符号序列进行分析,甚至能以较高的精度很快的估计出其根密钥(系统参数或初始条件)。
上述结论虽然是针对以单峰映射为主的混沌编码模型进行的分析,但是,混沌流密码方案的安全性不应该取决于其中采用的混沌系统,而应该取决于方案本身,而且单峰映射的低计算复杂度对于实际应用仍是非常有吸引力的。因此,我们认为,如果希望利用混沌编码模型来设计更为安全的密码系统,必须在混沌编码模型产生的符号序列作为伪随机序列输出(如用作密钥流或扩频码)之前引入某种扰乱策略,这种扰乱策略实质上相当于密码系统中的非线性变换。
该非线性变换不应影响混沌系统本身的特性,因为向混沌系统的内部注入扰动会将原自治混沌系统变为了非自治混沌系统,但当自治混沌系统变为非自治混沌系统之后,这些良好特性可能会随之发生较大的变化,且不为设计者所控制。这样有可能引入原本没有的安全隐患,甚至会为分析者大开方便之门。
上述非线性变换还应该能被混沌编码模型产生的符号序列所改变。否则,分析者很容易通过输出的伪随机序列恢复出原符号序列,并利用符号动力学分析方法估计出混沌编码模型的系统参数和初始条件。因此,非线性变换的构造就成了设计高安全性数字混沌密码系统的关键之一。
2 混沌流密码系统的总体方案
为克服上述问题,我们提出了如下的混沌流密码系统的总体方案,如图1所示:
在该方案中,首先利用一个混沌映射f产生混沌序列xi,再通过编码C产生符号序列ai,将所得符号序列作为驱动序列ai通过一个动态变化的置换Bi以得到密钥流ki,然后据此对置换进行动态变换T。最后,将密钥流(即密钥序列)与明文信息流异或即可产生相应的密文输出(即输出部分)。图1中的初始化过程包括对混沌系统的初始条件、迭代次数,用于组合编码的顺序表以及非线性变换进行初始化,初始化过程实质上是对工作密钥的输入。
在图1所示的混沌编码模型中,我们对实数模式下的混沌系统的输出进行了编码、采样。以Logistic为例,首先,以有限群论为基本原理对驱动序列进行非线性变换,然后,根据有限群上的随机行走理论,使非线性变换被混沌编码模型产生的驱动序列所改变。可以从理论上证明,我们对非线性变换采用的变换 *** 作是对称群的一个生成系,所以,这里所使用的非线性变换的状态空间足够大(一共有256!种)。
3 克服数字混沌特性退化的方法
增加精度可以在某些方面减小有限精度所造成的影响,但效果与其实现的代价相比显然是不适宜的。为此,周红等人在文献[22]中提出将m序列的输出值作为扰动加到数字混沌映射系统中,用于扩展数字混沌序列的周期;王宏霞等人在文献[23]中提出用LFSR的输出值控制数字混沌序列输出,从而改善混沌序列的性质;李汇州等人在文献[24]中提出用双分辨率的方法解决离散混沌映射系统的满映射问题。上述方法又带来新的问题:使用m序列和LFSR方法,混沌序列的性质由外加的m序列的性质决定;使用双分辨率时,由于输入的分辨率高于输出的分辨率,其效果与实现的代价相比仍然没有得到明显的改善。
为此,我们提出了一种基于Lyapunov数的变参数补偿方法。由于Lyapunov数是混沌映射在迭代点处斜率绝对值的几何平均值,所以,可以将它与中值定理结合对数字混沌进行补偿。以一维混沌映射为例,该补偿方法的迭代式为:
(1)
式中, 为Lyapunov数,ki是可变参数。
参数ki的选择需要满足下面几个条件:
(1)ki的选取应使混沌的迭代在有限精度下达到满映射;
(2)ki的选取应使混沌序列的分布近似地等于实值混沌的分布;
(3)ki的选取应使混沌序列的周期尽可能的长。
根据上述几个条件,我们已经选取了合适的80个参数,并且以Logistic为例对该变参数补偿方法输出的混沌序列进行了分析。在精度为32位的条件下,我们计算了混沌序列的周期,其结果如下:
除周期外,我们还对复杂度、相关性和序列分布进行了检测。从结果可知,该变参数补偿方法,使得在不降低混沌的复杂度基础上,增长其周期,减弱相关性,使其逼近实值混沌系统。该方法不仅非常明显地减小了有限精度所造成的影响,使数字混沌序列的密度分布逼近实值混沌序列的理论密度分布,改善数字混沌伪随机序列的密码学性质,而且极大地降低实现其方法的代价。
4 非线性变换
为克服符号动力学分析对混沌密码系统的威胁,我们根据有限群上的随机行走理论提出了一种非线性变换方法,并对引入了非线性变换的混沌密码系统进行了符号动力学分析,分析结果表明,引入了非线性变换的模型相对一般混沌编码模型而言,在符号动力学分析下具有较高的安全性。以二区间划分的模型为例,我们选用Logistic映射作为图1中的混沌映射f,并根据符号动力学分析中的Gray码序数[20,21]定义二进制码序数,见2式。
(2)
二值符号序列S的二进制码序数W(S)∈(0, 1)。注意,这里的Wr(xi)并不是单值的,因为同样的状态xi可能对应不同的置换Bi。
图2 在2区间划分下产生的二值符号序列的Wr(xi)分析
图2中的Wr(xi)为参数r控制下从当前状态xi出发产生的二值符号序列的二进制码序数。图2(a)是未进行非线性变换时的情形,可以看出,其它三种进行非线性变换时的情形都较图2(a)中的分形结构更为复杂。由此可见,引入了非线性变换的混沌模型相对一般混沌编码模型而言,在符号动力学分析下具有较高的安全性。
5 混沌流密码系统的理论分析和数值分析结果
51 理论分析结果
密钥流的性质直接关系到整个流密码系统的安全性,是一个极为重要的指标。我们对密钥流的均匀、独立分布性质和密钥流的周期性质给出了证明,其结果如下:
(1)密钥留在0,1,…,255上均匀分布。
(2)密钥流各元素之间相互独立。
(3)密钥流出现周期的概率趋向于零。
(4)有关密钥流性质的证明过程并不涉及改变非线性变换的具体 *** 作,也不涉及具体的驱动序列产生算法,仅仅要求驱动序列服从独立、均匀分布,并且驱动序列和非线性变换之间满足一定的条件,这为该密码系统,特别是系统驱动部分的设计和改进留下余地。
总之,该密码系统可扩展,可改进,性能良好且稳定。
52 数值分析结果
目前,基本密码分析原理有:代替和线性逼近、分别征服攻击、统计分析等,为了阻止基于这些基本原理的密码分析,人们对密码流生成器提出了下列设计准则:周期准则、线性复杂度准则、统计准则、混淆准则、扩散准则和函数非线性准则。
我们主要根据以上准则,对本密码系统的密钥流性质进行保密性分析,以证明其安全性。分析表明:混沌流密码系统符合所有的安全性设计准则,产生的密钥序列具有串分布均匀、随机统计特性良好、相邻密钥相关性小、周期长、线性复杂度高、混淆扩散性好、相空间无结构出现等特点;该密码系统的工作密钥空间巨大,足以抵抗穷举密钥攻击。并且,由于我们采用了非线性变换,所以该密码系统可以抵抗符号动力学分析。
6 应用情况简介
该混沌流密码系统既有效的降低了计算复杂度,又极大的提高了密码的安全强度,从而为混沌密码学及其实现技术的研究提供了一条新的途径。该系统已于2002年10月30日获得一项发明专利:“一种用于信息安全的加解密系统”(001312871),并于2005年4月获得国家密码管理局的批准,命名为“SSF46”算法,现已纳入国家商用密码管理。该算法保密性强,加解密速度快,适合于流媒体加密,可在银行、证券、网络通信、电信、移动通信等需要保密的领域和行业得到推广。该加密算法被应用在基于手机令牌的身份认证系统中,并且我们正在与华为公司合作将加密算法应用于3G的安全通信之中。
参考文献
[1] Kocarev L, Jakimoski G, Stojanovski T, Parlitz U, From chaotic maps to encryption schemes, In Proc IEEE Int Sym CAS 1998, 4: 514-517
[2] Kocarev L, Chaos-based cryptography: A brief overview, IEEE Circuits and Systems, 2001, 1(3): 6-21
[3] Habutsu T, Nishio Y, Sasase I, Mori S, A secret key cryptosystem by iterating a chaotic map, in Proc Advances in Cryptology-EUROCRYPT’91, Springer, Berlin, 1991, 127-140
[4] Fridrich J, Symmetric ciphers based on two-dimensional chaotic maps, Int J Bifurcation Chaos, vol8, no6, 1998, 1259-1284
[5] Baptista M S, Cryptography with chaos, Phys Lett A, 1998, 240: 50-54
[6] Wai-kit W, Lap-piu L, Kwok-wo W, A modified chaotic cryptographic method, Computer Physics Communications, 2001, 138:234-236
[7] Alvarez E, Fernandez A, Garcia P, Jimenez J, et al, New approach to chaotic encryption, Phys Lett A, 1999, 263: 373-375
[8] Jakimoski G, Kocarev L, Chaos and cryptography: Block encryption ciphers based on chaotic maps, IEEE Tran CAS-I, 2001, 48: 163-169
[9] Stojanovski T, Kocarev L, Chaos-based random number generators—Part I: Analysis, IEEE Tran CAS-I, 2001, 48(3):281-288
[10] Stojanovski T, Pihl J, Kocarev L, Chaos-based random number generators—Part II: Practical Realization, IEEE Tran CAS-I, 2001, 48(3):382-385
[11] >
以上就是关于从事计算复杂性理论、密码学以及程序校验的中国科学家有谁全部的内容,包括:从事计算复杂性理论、密码学以及程序校验的中国科学家有谁、MD5校验码、rsa算法中p,q,n,e,d一般大小都为多少啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)