① 真随机数的定义是什么
电子程序中的随机数其实并不随机,只是周期性非常长,可以用计算机算出来,只是因为计算量大要算很久可能算完了人家早就把密码换了甚至需要几百年来计算,但是假设你有一台超级牛逼的量子计算机就可以很快算出来的。
真随机数的意思就是说这个东西真的是随机的,无法预测,就算是量子计算机也没用。
中国的的反量子计算机加密就是真随机数,直接用双缝干涉实验得出的一个值。
② 利用真随机密钥+一次一密乱码本做的加密可以被破解吗
无法被破解,事实上。
密码不止存在于电脑中,我们完全可以使用掷骰子的方式来确定乱码本。这个乱码本就是真随机的。
其次,比如说我对一个单词“GOOD”进行了加密,加密后的密文是“DSWG”。你不知道密钥,所以你要穷举猜测。虽然你在尝试穷举破解时可能会找到“GOOD”,但是你也可能会猜出“F**K”,“LUCK”,“SANS”,“FFFF”等等奇怪的明文,这些明文属于干扰项,重点是你还不知道我明文到底是什么。所以当GOOD是明文时,你可能会认为FFFF是明文,或者是LUCK是明文。
③ SHA256 加密后能不能解密
SHA是散列算法,不是加密算法,不存在解密的问题。
原因:
对数据解密破解就是找到任意一个源数据,能够生成相同的目标数据。
SHA256基本上是不可破解的,即找不到(或概率极小)“碰撞”结果。
网站的解密规则:
网站从浏览器发送过来的信息当中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
(3)真随机数加密解密扩展阅读:
加密解密过程中,浏览器对网站的验证:
1、验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
2、如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
3、使用约定好的HASH算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
④ 加密解密字符串的算法原理
我们经常需要一种措施来保护我们的数据,防止被一些怀有不良用心的人所看到或者破坏。在信息时代,信息可以帮助团体或个人,使他们受益,同样,信息也可以用来对他们构成威胁,造成破坏。在竞争激烈的大公司中,工业间谍经常会获取对方的情报。因此,在客观上就需要一种强有力的安全措施来保护机密数据不被窃取或篡改。数据加密与解密从宏观上讲是非常简单的,很容易理解。加密与解密的一些方法是非常直接的,很容易掌握,可以很方便的对机密数据进行加密和解密。
一:数据加密方法
在传统上,我们有几种方法来加密数据流。所有这些方法都可以用软件很容易的实现,但是当我们只知道密文的时候,是不容易破译这些加密算法的(当同时有原文和密文时,破译加密算法虽然也不是很容易,但已经是可能的了)。最好的加密算法对系统性能几乎没有影响,并且还可以带来其他内在的优点。例如,大家都知道的pkzip,它既压缩数据又加密数据。又如,dbms的一些软件包总是包含一些加密方法以使复制文件这一功能对一些敏感数据是无效的,或者需要用户的密码。所有这些加密算法都要有高效的加密和解密能力。
幸运的是,在所有的加密算法中最简单的一种就是“置换表”算法,这种算法也能很好达到加密的需要。每一个数据段(总是一个字节)对应着“置换表”中的一个偏移量,偏移量所对应的值就输出成为加密后的文件。加密程序和解密程序都需要一个这样的“置换表”。事实上,80x86 cpu系列就有一个指令‘xlat’在硬件级来完成这样的工作。这种加密算法比较简单,加密解密速度都很快,但是一旦这个“置换表”被对方获得,那这个加密方案就完全被识破了。更进一步讲,这种加密算法对于黑客破译来讲是相当直接的,只要找到一个“置换表”就可以了。这种方法在计算机出现之前就已经被广泛的使用。
对这种“置换表”方式的一个改进就是使用2个或者更多的“置换表”,这些表都是基于数据流中字节的位置的,或者基于数据流本身。这时,破译变的更加困难,因为黑客必须正确的做几次变换。通过使用更多的“置换表”,并且按伪随机的方式使用每个表,这种改进的加密方法已经变的很难破译。比如,我们可以对所有的偶数位置的数据使用a表,对所有的奇数位置使用b表,即使黑客获得了明文和密文,他想破译这个加密方案也是非常困难的,除非黑客确切的知道用了两张表。
与使用“置换表”相类似,“变换数据位置”也在计算机加密中使用。但是,这需要更多的执行时间。从输入中读入明文放到一个buffer中,再在buffer中对他们重排序,然后按这个顺序再输出。解密程序按相反的顺序还原数据。这种方法总是和一些别的加密算法混合使用,这就使得破译变的特别的困难,几乎有些不可能了。例如,有这样一个词,变换起字母的顺序,slient 可以变为listen,但所有的字母都没有变化,没有增加也没有减少,但是字母之间的顺序已经变化了。
但是,还有一种更好的加密算法,只有计算机可以做,就是字/字节循环移位和xor操作。如果我们把一个字或字节在一个数据流内做循环移位,使用多个或变化的方向(左移或右移),就可以迅速的产生一个加密的数据流。这种方法是很好的,破译它就更加困难!而且,更进一步的是,如果再使用xor操作,按位做异或操作,就就使破译密码更加困难了。如果再使用伪随机的方法,这涉及到要产生一系列的数字,我们可以使用fibbonaci数列。对数列所产生的数做模运算(例如模3),得到一个结果,然后循环移位这个结果的次数,将使破译次密码变的几乎不可能!但是,使用fibbonaci数列这种伪随机的方式所产生的密码对我们的解密程序来讲是非常容易的。
在一些情况下,我们想能够知道数据是否已经被篡改了或被破坏了,这时就需要产生一些校验码,并且把这些校验码插入到数据流中。这样做对数据的防伪与程序本身都是有好处的。但是感染计算机程序的病毒才不会在意这些数据或程序是否加过密,是否有数字签名。所以,加密程序在每次load到内存要开始执行时,都要检查一下本身是否被病毒感染,对与需要加、解密的文件都要做这种检查!很自然,这样一种方法体制应该保密的,因为病毒程序的编写者将会利用这些来破坏别人的程序或数据。因此,在一些反病毒或杀病毒软件中一定要使用加密技术。
循环冗余校验是一种典型的校验数据的方法。对于每一个数据块,它使用位循环移位和xor操作来产生一个16位或32位的校验和 ,这使得丢失一位或两个位的错误一定会导致校验和出错。这种方式很久以来就应用于文件的传输,例如 xmodem-crc。 这是方法已经成为标准,而且有详细的文档。但是,基于标准crc算法的一种修改算法对于发现加密数据块中的错误和文件是否被病毒感染是很有效的。
二.基于公钥的加密算法
一个好的加密算法的重要特点之一是具有这种能力:可以指定一个密码或密钥,并用它来加密明文,不同的密码或密钥产生不同的密文。这又分为两种方式:对称密钥算法和非对称密钥算法。所谓对称密钥算法就是加密解密都使用相同的密钥,非对称密钥算法就是加密解密使用不同的密钥。非常着名的pgp公钥加密以及rsa加密方法都是非对称加密算法。加密密钥,即公钥,与解密密钥,即私钥,是非常的不同的。从数学理论上讲,几乎没有真正不可逆的算法存在。例如,对于一个输入‘a’执行一个操作得到结果‘b’,那么我们可以基于‘b’,做一个相对应的操作,导出输入‘a’。在一些情况下,对于每一种操作,我们可以得到一个确定的值,或者该操作没有定义(比如,除数为0)。对于一个没有定义的操作来讲,基于加密算法,可以成功地防止把一个公钥变换成为私钥。因此,要想破译非对称加密算法,找到那个唯一的密钥,唯一的方法只能是反复的试验,而这需要大量的处理时间。
rsa加密算法使用了两个非常大的素数来产生公钥和私钥。即使从一个公钥中通过因数分解可以得到私钥,但这个运算所包含的计算量是非常巨大的,以至于在现实上是不可行的。加密算法本身也是很慢的,这使得使用rsa算法加密大量的数据变的有些不可行。这就使得一些现实中加密算法都基于rsa加密算法。pgp算法(以及大多数基于rsa算法的加密方法)使用公钥来加密一个对称加密算法的密钥,然后再利用一个快速的对称加密算法来加密数据。这个对称算法的密钥是随机产生的,是保密的,因此,得到这个密钥的唯一方法就是使用私钥来解密。
我们举一个例子:假定现在要加密一些数据使用密钥‘12345’。利用rsa公钥,使用rsa算法加密这个密钥‘12345’,并把它放在要加密的数据的前面(可能后面跟着一个分割符或文件长度,以区分数据和密钥),然后,使用对称加密算法加密正文,使用的密钥就是‘12345’。当对方收到时,解密程序找到加密过的密钥,并利用rsa私钥解密出来,然后再确定出数据的开始位置,利用密钥‘12345’来解密数据。这样就使得一个可靠的经过高效加密的数据安全地传输和解密。
一些简单的基于rsa算法的加密算法可在下面的站点找到:
ftp://ftp.funet.fi/pub/crypt/cryptography/asymmetric/rsa
三.一个崭新的多步加密算法
现在又出现了一种新的加密算法,据说是几乎不可能被破译的。这个算法在1998年6月1日才正式公布的。下面详细的介绍这个算法:
使用一系列的数字(比如说128位密钥),来产生一个可重复的但高度随机化的伪随机的数字的序列。一次使用256个表项,使用随机数序列来产生密码转表,如下所示:
把256个随机数放在一个距阵中,然后对他们进行排序,使用这样一种方式(我们要记住最初的位置)使用最初的位置来产生一个表,随意排序的表,表中的数字在0到255之间。如果不是很明白如何来做,就可以不管它。但是,下面也提供了一些原码(在下面)是我们明白是如何来做的。现在,产生了一个具体的256字节的表。让这个随机数产生器接着来产生这个表中的其余的数,以至于每个表是不同的。下一步,使用"shotgun technique"技术来产生解码表。基本上说,如果 a映射到b,那么b一定可以映射到a,所以b[a[n]] = n.(n是一个在0到255之间的数)。在一个循环中赋值,使用一个256字节的解码表它对应于我们刚才在上一步产生的256字节的加密表。
使用这个方法,已经可以产生这样的一个表,表的顺序是随机,所以产生这256个字节的随机数使用的是二次伪随机,使用了两个额外的16位的密码.现在,已经有了两张转换表,基本的加密解密是如下这样工作的。前一个字节密文是这个256字节的表的索引。或者,为了提高加密效果,可以使用多余8位的值,甚至使用校验和或者crc算法来产生索引字节。假定这个表是256*256的数组,将会是下面的样子:
crypto1 = a[crypto0][value]
变量'crypto1'是加密后的数据,'crypto0'是前一个加密数据(或着是前面几个加密数据的一个函数值)。很自然的,第一个数据需要一个“种子”,这个“种子” 是我们必须记住的。如果使用256*256的表,这样做将会增加密文的长度。或者,可以使用你产生出随机数序列所用的密码,也可能是它的crc校验和。顺便提及的是曾作过这样一个测试: 使用16个字节来产生表的索引,以128位的密钥作为这16个字节的初始的"种子"。然后,在产生出这些随机数的表之后,就可以用来加密数据,速度达到每秒钟100k个字节。一定要保证在加密与解密时都使用加密的值作为表的索引,而且这两次一定要匹配。
加密时所产生的伪随机序列是很随意的,可以设计成想要的任何序列。没有关于这个随机序列的详细的信息,解密密文是不现实的。例如:一些ascii码的序列,如“eeeeeeee"可能被转化成一些随机的没有任何意义的乱码,每一个字节都依赖于其前一个字节的密文,而不是实际的值。对于任一个单个的字符的这种变换来说,隐藏了加密数据的有效的真正的长度。
如果确实不理解如何来产生一个随机数序列,就考虑fibbonacci数列,使用2个双字(64位)的数作为产生随机数的种子,再加上第三个双字来做xor操作。 这个算法产生了一系列的随机数。算法如下:
unsigned long dw1, dw2, dw3, dwmask;
int i1;
unsigned long arandom[256];
dw1 = {seed #1};
dw2 = {seed #2};
dwmask = {seed #3};
// this gives you 3 32-bit "seeds", or 96 bits total
for(i1=0; i1 < 256; i1++)
{
dw3 = (dw1 + dw2) ^ dwmask;
arandom[i1] = dw3;
dw1 = dw2;
dw2 = dw3;
}
如果想产生一系列的随机数字,比如说,在0和列表中所有的随机数之间的一些数,就可以使用下面的方法:
int __cdecl mysortproc(void *p1, void *p2)
{
unsigned long **pp1 = (unsigned long **)p1;
unsigned long **pp2 = (unsigned long **)p2;
if(**pp1 < **pp2)
return(-1);
else if(**pp1 > *pp2)
return(1);
return(0);
}
...
int i1;
unsigned long *aprandom[256];
unsigned long arandom[256]; // same array as before, in this case
int aresult[256]; // results go here
for(i1=0; i1 < 256; i1++)
{
aprandom[i1] = arandom + i1;
}
// now sort it
qsort(aprandom, 256, sizeof(*aprandom), mysortproc);
// final step - offsets for pointers are placed into output array
for(i1=0; i1 < 256; i1++)
{
aresult[i1] = (int)(aprandom[i1] - arandom);
}
...
变量'aresult'中的值应该是一个排过序的唯一的一系列的整数的数组,整数的值的范围均在0到255之间。这样一个数组是非常有用的,例如:对一个字节对字节的转换表,就可以很容易并且非常可靠的来产生一个短的密钥(经常作为一些随机数的种子)。这样一个表还有其他的用处,比如说:来产生一个随机的字符,计算机游戏中一个物体的随机的位置等等。上面的例子就其本身而言并没有构成一个加密算法,只是加密算法一个组成部分。
作为一个测试,开发了一个应用程序来测试上面所描述的加密算法。程序本身都经过了几次的优化和修改,来提高随机数的真正的随机性和防止会产生一些短的可重复的用于加密的随机数。用这个程序来加密一个文件,破解这个文件可能会需要非常巨大的时间以至于在现实上是不可能的。
四.结论:
由于在现实生活中,我们要确保一些敏感的数据只能被有相应权限的人看到,要确保信息在传输的过程中不会被篡改,截取,这就需要很多的安全系统大量的应用于政府、大公司以及个人系统。数据加密是肯定可以被破解的,但我们所想要的是一个特定时期的安全,也就是说,密文的破解应该是足够的困难,在现实上是不可能的,尤其是短时间内。
⑤ 加密和解密过程是怎样进行的
public class CryptUtils {
private final static String DES = "DES";
/**
* 加密
* @param src 数据源
* @param key 密钥,长度必须是8的倍数
* @return 返回加密后的数据
* @throws Exception
*/
public static byte[] encrypt(byte[] src, byte[] key) throws RuntimeException {
// DES算法要求有一个可信任的随机数源
try{
SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成
// 一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密匙初始化Cipher对象
cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
// 现在,获取数据并加密
// 正式执行加密操作
return cipher.doFinal(src);
}catch(Exception e){
throw new RuntimeException(e);
}
}
/**
* 解密
* @param src 数据源
* @param key 密钥,长度必须是8的倍数
* @return 返回解密后的原始数据
* @throws Exception
*/
public static byte[] decrypt(byte[] src, byte[] key) throws RuntimeException {
try{
// DES算法要求有一个可信任的随机数源
SecureRandom sr = new SecureRandom();
// 从原始密匙数据创建一个DESKeySpec对象
DESKeySpec dks = new DESKeySpec(key);
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
// 一个SecretKey对象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
SecretKey securekey = keyFactory.generateSecret(dks);
// Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance(DES);
// 用密匙初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
// 现在,获取数据并解密
// 正式执行解密操作
return cipher.doFinal(src);
}catch(Exception e){
throw new RuntimeException(e);
}
}
⑥ 异或加密与解密(C语言)注释
异或运算有一个特性
若
c = a xor b
那么
a = c xor b
根据这样的特性,你有一个信息a,然后你产生一个密码b,把它和a异或运算之后就变成了c。这就是一种加密,解密的时候,把c重新和b异或运算,就变回了a。
顺带说一下,异或是很弱的加密方法,很容易被破解的。
⑦ 数据加密
数据加密技术是指将一个信息或称明文,经过加密钥匙及加密函数转换,变成无意义的密文,而接收方则将此密文经过解密函数、解密钥匙还原成明文。加密技术广泛用于网络数据的安全领域。
数据加密技术要求只有在指定的用户或网络下,才能解除密码而获得原来的数据,这就需要给数据发送方和接受方以一些特殊的信息用于加解密,这就是所谓的密钥。其密钥的值是从大量的随机数中选取的。按加密算法分为专用密钥和公开密钥两种。
1)专用密钥,又称为对称密钥或单密钥,加密和解密时使用同一个密钥,即同一个算法。如DES和MIT的Kerberos算法。专用密钥是最简单方式,通信双方必须交换彼此密钥,当需给对方发信息时,用自己的加密密钥进行加密,而在接收方收到数据后,用对方所给的密钥进行解密。当一个文本要加密传送时,该文本用密钥加密构成密文,密文在信道上传送,收到密文后用同一个密钥将密文解出来,形成普通文体供阅读。由于对称密钥运算量小、速度快、安全强度高,因而目前仍广泛被采用。
2)公开密钥,又称非对称密钥,加密和解密时使用不同的密钥,即不同的算法,虽然两者之间存在一定的关系,但不可能轻易地从一个推导出另一个。有一把公用的加密密钥,有多把解密密钥,如RSA算法。公开密钥由于两个密钥(加密密钥和解密密钥)各不相同,因而可以将一个密钥公开,而将另一个密钥保密,同样可以起到加密的作用。在这种编码过程中,一个密码用来加密消息,而另一个密码用来解密消息。在两个密钥中有一种关系,通常是数学关系。公钥和私钥都是一组十分长的、数字上相关的素数(是另一个大数字的因数)。有一个密钥不足以翻译出消息,因为用一个密钥加密的消息只能用另一个密钥才能解密。每个用户可以得到唯一的一对密钥,一个是公开的,另一个是保密的。公共密钥保存在公共区域,可在用户中传递,甚至可印在报纸上面。而私钥必须存放在安全保密的地方。任何人都可以有你的公钥,但是只有你一个人能有你的私钥。它的工作过程是:“你要我听你的吗?除非你用我的公钥加密该消息,我就可以听你的,因为我知道没有别人在偷听。只有我的私钥(其他人没有)才能解密该消息,所以我知道没有人能读到这个消息。我不必担心大家都有我的公钥,因为它不能用来解密该消息。”公开密钥的加密机制虽提供了良好的保密性,但难以鉴别发送者,即任何得到公开密钥的人都可以生成和发送报文。数字签名机制提供了一种鉴别方法,以解决伪造、抵赖、冒充和篡改等问题。
⑧ 加密模块如何配合随机数使用
随机数主要是用来生成AES的密钥,然后根据AES的配置128/256或者是多少将输入数据进行分块加密,最后输出加密的数据,并保存密钥。
SOC芯片的话,里面一般都有一个cpu(可编程控制器),你需要编程来控制上面说的过程,同时密钥的保存是一个很重要的事情,如果你这个产品有输入设备的话,最好是将这些密钥保存到一个密钥库里面,然后用一个用户的口令来加密这个密钥库。
⑨ 什么是伪随机数与真随机数
随机数
计算机使用的随机数是一种伪随机数,伪随机数有多种生成算法,甚至还有硬件随机数发生器,但也还是伪随机数。
真随机数符合正态分布且其生成不能重现,真随机数在自然界中几乎不存在。但如果一个随机数能够被重现的机率很小,则认为其为随机数,称为伪随机数。
下面的算法介绍了一种非常简单的伪随机数生成算法,生成0到1之间的随机数。
因为是伪随机数,所以知道了随机数算法和种子,总能够直到随机数序列中任何一个随机数的值,所以一般来说种子的设置都是使用当前时间的毫秒数,保证随机数列的不重复性。
随机数的应用非常广泛,常见的加密解密都要用到,还有随机筛选,计算概率等等。还有一个常见的例子就是计算hash表,利用了同样的种子能得到同样的随机序列这种特性而采用随机函数作为hash函数。
http://blog.clubbenq.com.cn/904569/archive/2005/08/09/13380.aspx