『壹』 概率加密和Goldwasser-Micali密碼系統
註:以下內容出自《An Introction to Mathematical Cryptography》3.10 Probabilistic Encryption and the Goldwasser–Micali Cryptosystem一節。
假如Alice使用公鑰密碼系統向Bob發送信息,如比特0或1。在該場景下,這樣的方式可能是不安全的。偷聽者Eve可以加密兩個可能的明文 m = 0 和 m = 1,然後將加密值與 Alice 的密文進行比較。更一般地說,在任何一個密碼系統中,如果它可能的明文集合很小,那麼Eve 總是可以使用 Bob 的公鑰加密各個明文,然後找到和Alice發送的一樣的密文。
所謂的概率加密(Probabilistic encryption)是由Goldwasser 和 Micali 發明的針對上述問題的加密方法。其想法是 Alice 選擇一個明文 m 和一個隨機數據r,然後使用 Bob 的公鑰加密 (m,r)對。理想情況下,當 r 選遍所有可能的值, 的加密值將「隨機」選遍可能的密文。更准確地說,對於任何固定的 和 以及變化的 ,對下面兩個量的值在分布上應該是不可區分的:
注意,Bob 在進行解密時沒有必要恢復完整的 對,他只需要恢復明文 即可。
上面這個想法的思路是很清晰的,但是如何創造一個實際可行的概率加密方案呢?Goldwasser 和 Micali 描述了一種方案,雖然不實用(因為它一次只加密 1 位),但其 具有易於描述和分析 的優點。 他們的想法基於以下的困難問題:
設 和 是需要保密的兩個不同的素數;令 ,並公開 ;給定一個整數 ,判斷 是否是模 的一個二次剩餘,即判斷同餘方程 是否可解。
我們注意到,由於Bob知道如何分解 ,他可以方便的計算: 是模 的二次剩餘,當且僅當 是模 的二次剩餘而且 也是模 的二次剩餘。而對於 ,由於她只知道 ,即使她計算 對 的Jacob符號,仍然無法知道 是否是模 的二次剩餘。
Goldwasser 和 Micali 利用這一事實, 創建了下表描述的概率公鑰密碼系統。
該方案易於驗證:
因為Alice隨機選取 ,當Alice加密明文 時,可以選遍模N的二次剩餘;當Alice加密明文 時,可以選遍模N的二次非剩餘(且該數對 的Jacob符號為1)。這樣的話,即使Eve計算 對 的Jacob符號,仍無法獲得任何有用的信息,如下:
即無法判斷同餘方程 是否可解。
來看一個例子,Bob通過以下參數創建Goldwasser–Micali公鑰:
可以確認 。Bob公開 作為公鑰,保留 。
如果Alice要發送的明文比特 ,她首選在[1,13048158]范圍內隨機選取 。然後計算
,並將密文 發送給Bob。Bob通過計算 對 的Legendre符號,即 ,即可知明文 。
之後,Alice繼續發送 。同樣先隨機選取 ,然後計算
,並將密文 發送給Bob。Bob通過計算 對 的Legendre符號,即 ,即可知明文m=1。
按照這樣的方式,如果Alice再次發送明文 ,隨機選取r之後計算
。
可以看到,前後兩次發送的 的密文是完全沒有相關性的。
註:
Goldwasser-Micali 公鑰密碼系統其實不實用,因為明文的每一位都模 N 加密。為了安全,要保證 Eve 不能有效分解 ,所以 N 至少是一個 1000 位bit長的數。 這樣,如果 Alice 想向 Bob 發送 位長度明文,她的密文將有 位長。因此,Goldwasswer-Micali 公鑰密碼系統的密文膨脹率為 1000。一般來說,Goldwasswer-Micali 公鑰密碼系統的密文膨脹率為 。
存在其他密文膨脹率小得多的的概率公鑰加密系統。比如Elgamal公鑰加密系統。
『貳』 數據結構或演算法分析,一串隨機字元的加密或編碼方式
linux的uuid碼也是有內核提供的,在/proc/sys/kernel/random/uuid這個文件內。其實,random目錄,裡面還有很多其它文件,都與生成uuid有關系的。
1 [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid
2 dff68213-b700-4947-87b1-d9e640334196
3 [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid
4 7b57209a-d285-4fd0-88b4-9d3162d2e1bc
5 #連續2次讀取,得到的uuid是不同的
6
7 [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid| cksum | cut -f1 -d" "
8 2141807556
9 #同上方法得到隨機整數
這是linux。
『叄』 如何在C語言中生成一定范圍內的隨機數
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
srand()((int)time(NULL));設定隨機數種子
rand()()%100;產生0-99的隨機數。高級點的,假如要產生16-59之間的數,你可以這樣寫:rand()()%44+16(這里44由59-16+1得到)。其他情況如法炮製!
各種編程語言返回的隨機數(確切地說是偽隨機數)實際上都是根據遞推公式計算的一組數值,當序列足夠長,這組數值近似滿足均勻分布。如果計算偽隨機序列的初始數值(稱為種子)相同,則計算出來的偽隨機序列就是完全相同的。這個特性被有的軟體利用於加密和解密。加密時,可以用某個種子數生成一個偽隨機序列並對數據進行處理;解密時,再利用種子數生成一個偽隨機序列並對加密數據進行還原。這樣,對於不知道種子數的人要想解密就需要多費些事了。當然,這種完全相同的序列對於你來說是非常糟糕的。要解決這個問題,需要在每次產生隨機序列前,先指定不同的種子,這樣計算出來的隨機序列就不會完全相同了。你可以在調用rand()函數之前調用srand( (unsigned)time( NULL ) ),這樣以time函數值(即當前時間)作為種子數,因為兩次調用rand函數的時間通常是不同的,這樣就可以保證隨機性了。你也可以使用srand函數來人為指定種子數。
參考資料:http://..com/question/132839023.html
『肆』 如何對文件進行加密,然後是隨機密碼,給一個cdk號碼,因為cdk不一樣,可以生成不同的密碼。
加殼加密就可以實現的,隨機生成注冊碼,方便快捷
『伍』 計算機密碼學中有哪些加密演算法
、信息加密概述
密碼學是一門古老而深奧的學科,它對一般人來說是莫生的,因為長期以來,它只在很少的范圍內,如軍事、外交、情報等部門使用。計算機密碼學是研究計算機信息加密、解密及其變換的科學,是數學和計算機的交義學科,也是一門新興的學科。隨著計算機網路和計算機通訊技術的發展,計算機密碼學得到前所未有的重視並迅速普及和發展起來。在國外,它已成為計算機安全主要的研究方向,也是計算機安全課程教學中的主要內容。
密碼是實現秘密通訊的主要手段,是隱蔽語言、文字、圖象的特種符號。凡是用特種符號按照通訊雙方約定的方法把電文的原形隱蔽起來,不為第三者所識別的通訊方式稱為密碼通訊。在計算機通訊中,採用密碼技術將信息隱蔽起來,再將隱蔽後的信息傳輸出去,使信息在傳輸過程中即使被竊取或載獲,竊取者也不能了解信息的內容,從而保證信息傳輸的安全。
任何一個加密系統至少包括下面四個組成部分:
( 1)、未加密的報文,也稱明文。
( 2)、加密後的報文,也稱密文。
( 3)、加密解密設備或演算法。
( 4)、加密解密的密鑰。
發送方用加密密鑰,通過加密設備或演算法,將信息加密後發送出去。接收方在收到密文後,用解密密鑰將密文解密,恢復為明文。如果傳輸中有人竊取,他只能得到無法理解的密文,從而對信息起到保密作用。
二、密碼的分類
從不同的角度根據不同的標准,可以把密碼分成若干類。
(一)按應用技術或歷史發展階段劃分:
1、手工密碼。以手工完成加密作業,或者以簡單器具輔助操作的密碼,叫作手工密碼。第一次世界大戰前主要是這種作業形式。
2、機械密碼。以機械密碼機或電動密碼機來完成加解密作業的密碼,叫作機械密碼。這種密碼從第一次世界大戰出現到第二次世界大戰中得到普遍應用。3、電子機內亂密碼。通過電子電路,以嚴格的程序進行邏輯運算,以少量制亂元素生產大量的加密亂數,因為其制亂是在加解密過程中完成的而不需預先製作,所以稱為電子機內亂密碼。從五十年代末期出現到七十年代廣泛應用。
4、計算機密碼,是以計算機軟體編程進行演算法加密為特點,適用於計算機數據保護和網路通訊等廣泛用途的密碼。
(二)按保密程度劃分:
1、理論上保密的密碼。不管獲取多少密文和有多大的計算能力,對明文始終不能得到唯一解的密碼,叫作理論上保密的密碼。也叫理論不可破的密碼。如客觀隨機一次一密的密碼就屬於這種。
2、實際上保密的密碼。在理論上可破,但在現有客觀條件下,無法通過計算來確定唯一解的密碼,叫作實際上保密的密碼。
3、不保密的密碼。在獲取一定數量的密文後可以得到唯一解的密碼,叫作不保密密碼。如早期單表代替密碼,後來的多表代替密碼,以及明文加少量密鑰等密碼,現在都成為不保密的密碼。
(三)、按密鑰方式劃分:
1、對稱式密碼。收發雙方使用相同密鑰的密碼,叫作對稱式密碼。傳統的密碼都屬此類。
2、非對稱式密碼。收發雙方使用不同密鑰的密碼,叫作非對稱式密碼。如現代密碼中的公共密鑰密碼就屬此類。
(四)按明文形態:
1、模擬型密碼。用以加密模擬信息。如對動態范圍之內,連續變化的語音信號加密的密碼,叫作模擬式密碼。
2、數字型密碼。用於加密數字信息。對兩個離散電平構成0、1二進制關系的電報信息加密的密碼叫作數字型密碼。
(五)按編制原理劃分:
可分為移位、代替和置換三種以及它們的組合形式。古今中外的密碼,不論其形態多麼繁雜,變化多麼巧妙,都是按照這三種基本原理編制出來的。移位、代替和置換這三種原理在密碼編制和使用中相互結合,靈活應用。
『陸』 如何在Linux中產生,加密或解密隨機密碼
1. 使用命令 pwgen 來生成一個長度為 10 個字元的獨特的隨機密碼。假如你還沒有安裝 pwgen,請使用 Apt 或 YUM 等包管理器來安裝它。
$ pwgen 101
生成一個獨特的隨機密碼
一口氣生成若干組長度為 50 個字元的唯一的隨機密碼!
$ pwgen 50
生成多組隨機密碼
2. 你還可以使用 makepasswd 來每次生成一個給定長度的獨特的隨機密碼。在你把玩 makepasswd 命令之前,請確保你已經安裝了它。如若沒有安裝它,試試使用 Apt 或 YUM 包管理器來安裝 makepasswd這個軟體包。
生成一個長度為 10 個字元的隨機密碼。該命令產生的密碼的長度默認為 10。
$ makepasswd
使用 makepasswd 生成獨特的密碼
生成一個長度為 50 個字元的隨機密碼。
$ makepasswd --char50
生成長度為 50 的密碼
生成 7 個長度為 20 個字元的隨機密碼。
$ makepasswd --char20--count 7
3. 使用帶「鹽」的 Crypt(註:這里應該指的是一個函數,可以參考這里 ) 來加密一個密碼。提供手動或自動添加 「鹽」。
對於那些不清楚 鹽 的意義的人,這里的 「鹽」 指的是一個隨機數據,它作為密碼生成函數的一個額外的輸入, 目的是保護密碼免受詞典攻擊。
在執行下面的操作前,請確保你已經安裝了 mkpasswd。
下面的命令將帶 「鹽」 加密一個密碼。「鹽」 的值是隨機自動生成的。所以每次你運行下面的命令時,都將產生不同的輸出,因為它每次接受了隨機取值的 「鹽」。
$ mkpasswd tecmint
使用 Crypt 來加密密碼
現在讓我們來手動定義 「鹽」 的值。每次它將產生相同的結果。請注意你可以輸入任何你想輸入的值來作為 「鹽」 的值。
$ mkpasswd tecmint -s tt
帶「鹽」加密密碼
另外, mkpasswd 還是互動式的,假如你在命令中沒有提供密碼,它將主動詢問你來輸入密碼。
4. 使用 aes-256-cbc 加密演算法並使用帶「鹽」的密碼(如 「tecmint」) 加密一個字元串(如 「Tecmint-is-a-Linux-Community」)。
# echo Tecmint-is-a-Linux-Community | openssl enc -aes-256-cbc -a -salt -pass pass:tecmint
在 Linux 中加密一個字元串
在上面例子中, echo 命令的輸出通過管道傳遞給了 openssl 命令,使得該輸出通過加密編碼方式(enc:Encoding with Cipher ) 所加密,這個過程中使用了 aes-256-cbc 加密演算法,並附帶了密碼 (tecmint) 和 「鹽」 。
5. 使用 openssl 命令的 -aes-256-cbc 解密選項來解密上面的字元串。
# echo U2FsdGVkX18Zgoc+/Z | openssl enc -aes-256-cbc -a -d -salt -pass pass:tecmint
在 Linux 中解密字元串
現在就是這些內容了。
『柒』 如何在 Linux 中產生,加密或解密隨機密碼
給文件加密,我使用的是超級加密3000. 超級加密3000採用國際上成熟的加密演算法和安全快速的加密方法,可以有效保障數據安全! 具體操作方法: 1 下載安裝超級加密3000。 2 然後在需要加密的文件上單擊滑鼠右鍵選擇加密。
『捌』 如何用c語言產生一定范圍內的隨機數
利用srand((unsigned int)(time(NULL))是一種方法,因為每一次運行程序的時間是不同的。
在C語言里所提供的隨機數發生器的用法:現在的C編譯器都提供了一個基於ANSI標準的偽隨機數發生器函數,用來生成隨機數。它們就是rand()和srand()函數。這二個函數的工作過程如下:
1) 首先給srand()提供一個種子,它是一個unsigned int類型,其取值范圍從0~65535;
2) 然後調用rand(),它會根據提供給srand()的種子值返回一個隨機數(在0到32767之間)
3) 根據需要多次調用rand(),從而不間斷地得到新的隨機數;
4) 無論什麼時候,都可以給srand()提供一個新的種子,從而進一步「隨機化」rand()的輸出結果。
下面是0~32767之間的隨機數程序:
#include <stdlib.h>
#include <stdio.h>
#include <time.h> // 使用當前時鍾做種子
void main(void)
{int i;
srand((unsigned)time( NULL ) ); // 初始化隨機數
for(i = 0; i < 10;i++) // 列印出 10 個隨機數
printf("%d ", rand() );
}
根據上面的程序可以很容易得到0~1之間的隨機數:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main( )
{int i;
srand((unsigned)time( NULL ) );
for(i = 0; i < 10;i++)
printf("%5.2f ", rand()/32767.0);
}
而產生1~100之間的隨機數可以這樣寫:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main( )
{int i;
srand((unsigned)time( NULL ) );
for(i = 0; i < 10;i++)
printf("%d ", rand()%100+1);
}
(8)范圍內隨機的加密擴展閱讀:
C語言高效編程技巧:
一:以空間換時間
計算機程序中最大的矛盾是空間和時間的矛盾,那麼,從這個角度出發逆向思維來考慮程序的效率問題
二:數學方法解決問題
數學是計算機之母,沒有數學的依據和基礎,就沒有計算機發展,所以在編寫程序的時候,採用一些數學方法會對程序的執行效率有數量級的提高。
三:使用位操作
實現高效的C語言編寫的第三招----使用位操作,減少除法和取模的運算。
在計算機程序中,數據的位是可以操作的最小數據單位,理論上可以用「位運算」來完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做數據變換使用,但是,靈活的位操作可以有效提高程序運行的效率。