① 真隨機數的定義是什麼
電子程序中的隨機數其實並不隨機,只是周期性非常長,可以用計算機算出來,只是因為計算量大要算很久可能算完了人家早就把密碼換了甚至需要幾百年來計算,但是假設你有一台超級牛逼的量子計算機就可以很快算出來的。
真隨機數的意思就是說這個東西真的是隨機的,無法預測,就算是量子計算機也沒用。
中國的的反量子計算機加密就是真隨機數,直接用雙縫干涉實驗得出的一個值。
② 利用真隨機密鑰+一次一密亂碼本做的加密可以被破解嗎
無法被破解,事實上。
密碼不止存在於電腦中,我們完全可以使用擲骰子的方式來確定亂碼本。這個亂碼本就是真隨機的。
其次,比如說我對一個單詞「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