導航:首頁 > 源碼編譯 > rsa簽名演算法

rsa簽名演算法

發布時間:2022-02-07 12:12:02

㈠ 用RSA私鑰證書對摘要做簽名操作,簽名時演算法選擇SHA-1。

你SHA-1演算法得到的是ABCDE五個32位共160bit信息,RSA簽名的時候,要麼通過大素數(p>2^160)簽名,或者可以把五個32位分別拆分,整成一個unsigned int分別簽名。

㈡ rsa簽名演算法存在指數運算攻擊為什麼仍然應用廣泛

RSA的運算速度慢,所以很少用於對文件的加解密,在保密信道中常用於對會話秘鑰的加密。RSA主要用於PKI身份認證系統,詳細說有數字證書、數字簽名、數字簽章、數字水印、數字信封等。目前最貼近生活的一些案例如:銀行的u盾、銀行卡的刷卡機、淘寶和一二三0陸的數字證書。 另外現在隨著電子商務電子政務的鋪開,登陸認證許可權管理越來越貼近生活,RSA的空間越來越大。當然RSA也有著一些問題,雖然有PKCS系列標准框架罩著,仍然有黑客活動的空間,如前一段時間公布的一三分鍾破解RSA。現在商業的前沿已經開始著手用ECC演算法來替代RSA,重構人們的密碼生

㈢ RSA簽名時是發方用私鑰加密,用私鑰解密,但接收方不知道發方私鑰怎麼解密

但是接收方知道發送方的公鑰啊

樓主首先就沒懂簽名加密的概念,這里說的是分兩部分一 先簽名 二 後加密
舉例來說,一 簽名,假定接收方B已知發送方A的公鑰,則A可以通過用自己的私鑰對整個消息或消息的散列碼加密來產生數字簽名,由於是用發送方A的私鑰對消息加密,所以只有A可加密消息,因此,整個加密後的消息就是數字簽名。
接著是加密,用B的公鑰對或對稱密碼再對消息加密即可。
解密很簡單,因為加密就是B自己的公鑰,只有數字簽名才用到A的私鑰(而此前B已知A的公鑰)

㈣ RSA簽名演算法的問題 C語言

因為你的

scanf("%d%d",&p,&q);
兩個%d之間沒有逗號, 所以輸入也不能用逗號分隔, 應該用空格
please input the p,q: 7 17

㈤ RSA數字簽名是什麼

在數字簽名技術出現之前,曾經出現過一種「數字化簽名」技術,簡單地說就是在手寫板上簽名,然後將圖像傳輸到電子文檔中,這種「數字化簽名」可以被剪切, 然後粘貼到任意文檔上,這樣非法復制變得非常容易,所以這種簽名的方式是不安全的。數字簽名技術與數字化簽名技術是兩種截然不同的安全技術,數字簽名與用 戶的姓名和手寫簽名形式毫無關系,它實際使用了信息發送者的私有密鑰變換所需傳輸的信息。對於不同的文檔信息,發送者的數字簽名並不相同。沒有私有密鑰, 任何人都無法完成非法復制。從這個意義上來說,「數字簽名」是通過一個單向函數對要傳送的報文進行處理得到的,用以認證報文來源並核實報文是否發生變化的 一個字母數字串。java異常機制指南

原理

該技術在具體工作時,首先發送方對信息施以數學變換,所得的信息與原信息惟一對應;在接收方進行逆變換,得到原始信息。只要數學變換方法優良,變換後的信息在傳輸中就具有很強的安全性,很難被破譯、篡改。這一個過程稱為加密,對應的反變換過程稱為解密。
現在有兩類不同的加密技術,一類是對稱加密,雙方具有共享的密鑰,只有在雙方都知道密鑰的情況下才能使用,通常應用於孤立的環境之中,比如在使用自動取款 機(ATM)時,用戶需要輸入用戶識別號碼(PIN),銀行確認這個號碼後,雙方在獲得密碼的基礎上進行交易,如果用戶數目過多,超過了可以管理的范圍 時,這種機制並不可靠。
另一類是非對稱加密,也稱為公開密鑰加密,密鑰是由公開密鑰和私有密鑰組成的密鑰對,用私有密鑰進行加密,利用公開密鑰可以進行解密,但是由於公開密鑰無 法推算出私有密鑰,所以公開的密鑰並不會損害私有密鑰的安全,公開密鑰無須保密,可以公開傳播,而私有密鑰必須保密,丟失時需要報告鑒定中心及資料庫。

演算法

數字簽名的演算法很多, 應用最為廣泛的三種是: Hash簽名、DSS簽名和RSA簽名。
1. Hash簽名
Hash簽名不屬於強計算密集型演算法,應用較廣泛。它可以降低伺服器資源的消耗,減輕中央伺服器的負荷。Hash的主要局限是接收方必須持有用戶密鑰的副本以檢驗簽名, 因為雙方都知道生成簽名的密鑰,較容易攻破,存在偽造簽名的可能。
2. DSS和RSA簽名
DSS和RSA採用了公鑰演算法,不存在Hash的局限性。RSA是最流行的一種加密標准,許多產品的內核中都有RSA的軟體和類庫。早在Web飛速發展之 前,RSA數據安全公司就負責數字簽名軟體與Macintosh操作系統的集成,在Apple的協作軟體PowerTalk上還增加了簽名拖放功能,用戶 只要把需要加密的數據拖到相應的圖標上,就完成了電子形式的數字簽名。與DSS不同,RSA既可以用來加密數據,也可以用於身份認證。和Hash簽名相 比,在公鑰系統中,由於生成簽名的密鑰只存儲於用戶的計算機中,安全系數大一些。

功能

數字簽名可以解決否認、偽造、篡改及冒充等問題。具體要求:發送者事後不能否認發送的報文簽名、接收者能夠核實發送者發送的報文簽名、接收者不能偽造發送 者的報文簽名、接收者不能對發送者的報文進行部分篡改、網路中的某一用戶不能冒充另一用戶作為發送者或接收者。數字簽名的應用范圍十分廣泛,在保障電子數 據交換(EDI)的安全性上是一個突破性的進展,凡是需要對用戶的身份進行判斷的情況都可以使用數字簽名,比如加密信件、商務信函、定貨購買系統、遠程金 融交易、自動模式處理等等。

缺憾

數字簽名的引入過程中不可避免地會帶來一些新問題,需要進一步加以解決,數字簽名需要相關法律條文的支持。
1. 需要立法機構對數字簽名技術有足夠的重視,並且在立法上加快腳步,迅速制定有關法律,以充分實現數字簽名具有的特殊鑒別作用,有力地推動電子商務以及其他網上事務的發展。
2. 如果發送方的信息已經進行了數字簽名,那麼接收方就一定要有數字簽名軟體,這就要求軟體具有很高的普及性。
3. 假設某人發送信息後脫離了某個組織,被取消了原有數字簽名的許可權,以往發送的數字簽名在鑒定時只能在取消確認列表中找到原有確認信息,這樣就需要鑒定中心結合時間信息進行鑒定。
4. 基礎設施(鑒定中心、在線存取資料庫等)的費用,是採用公共資金還是在使用期內向用戶收費?如果在使用期內收費,會不會影響到這項技術的全面推廣?

實施

實現數字簽名有很多方法,目前採用較多的是非對稱加密技術和對稱加密技術。雖然這兩種技術實施步驟不盡相同,但大體的工作程序是一樣的。 用戶首先可以下載或者購買數字簽名軟體,然後安裝在個人電腦上。在產生密鑰對後,軟體自動向外界傳送公開密鑰。由於公共密鑰的存儲需要,所以需要建立一個 鑒定中心(CA)完成個人信息及其密鑰的確定工作。鑒定中心是一個政府參與管理的第三方成員,以便保證信息的安全和集中管理。用戶在獲取公開密鑰時,首先 向鑒定中心請求數字確認,鑒定中心確認用戶身份後,發出數字確認,同時鑒定中心向資料庫發送確認信息。然後用戶使用私有密鑰對所傳信息簽名,保證信息的完 整性、真實性,也使發送方無法否認信息的發送,之後發向接收方;接收方接收到信息後,使用公開密鑰確認數字簽名,進入資料庫檢查用戶確認信息的狀況和可信 度;最後資料庫向接收方返回用戶確認狀態信息。不過,在使用這種技術時,簽名者必須注意保護好私有密鑰,因為它是公開密鑰體系安全的重要基礎。如果密鑰丟 失,應該立即報告鑒定中心取消認證,將其列入確認取消列表之中。其次,鑒定中心必須能夠迅速確認用戶的身份及其密鑰的關系。一旦接收到用戶請求,鑒定中心 要立即認證信息的安全性並返回信息。

㈥ rsa 演算法的數字簽名 誰有啊

n=p*q=5*11=55 z=4*10=40 e*d mod z=1 3*d mod 40=1 d=27 公開密鑰=(n,e)=(55,3) 私密密鑰=(n,d)=(55,27) C=m的e次方 mod n=14 M=c的d次方 mod n 設m為要傳送的明文,利用公開密鑰(n,e)加密,C為加密後的密文。 則加密公式為:C=m的e次方 mod n,(0<=c<n) 利用秘密密鑰(n,d)解密,則解密公式為:m=c的d次方 mod n(0<=m<n)!

㈦ 如何使用rsa演算法實現數字簽名

什麼是RSA? RSA是一種非對稱加密演算法,用它可以產生公私鑰對,就是一個公鑰和一個私鑰。

什麼是數字簽名? 數字簽名就是 用私鑰對數據進行加密。

有了RSA產生的私鑰,然後再用RSA加密演算法時行加密,才能產生數字簽名。

明白?

當然,除了RSA,還有ECC等好多其它非對稱演算法。

㈧ rsa演算法原理

RSA演算法是最常用的非對稱加密演算法,它既能用於加密,也能用於數字簽名。RSA的安全基於大數分解的難度。其公鑰和私鑰是一對大素數(100到200位十進制數或更大)的函數。從一個公鑰和密文恢復出明文的難度,等價於分解兩個大素數之積。

我們可以通過一個簡單的例子來理解RSA的工作原理。為了便於計算。在以下實例中只選取小數值的素數p,q,以及e,假設用戶A需要將明文「key」通過RSA加密後傳遞給用戶B,過程如下:設計公私密鑰(e,n)和(d,n)。

令p=3,q=11,得出n=p×q=3×11=33;f(n)=(p-1)(q-1)=2×10=20;取e=3,(3與20互質)則e×d≡1 mod f(n),即3×d≡1 mod 20。通過試算我們找到,當d=7時,e×d≡1 mod f(n)同餘等式成立。因此,可令d=7。從而我們可以設計出一對公私密鑰,加密密鑰(公鑰)為:KU =(e,n)=(3,33),解密密鑰(私鑰)為:KR =(d,n)=(7,33)。

英文數字化。將明文信息數字化,並將每塊兩個數字分組。假定明文英文字母編碼表為按字母順序排列數值。則得到分組後的key的明文信息為:11,05,25。

明文加密。用戶加密密鑰(3,33) 將數字化明文分組信息加密成密文。由C≡Me(mod n)得:
C1(密文)≡M1(明文)^e (mod n) == 11≡11^3 mod 33 ;
C2(密文)≡M2(明文)^e (mod n) == 26≡05^3 mod 33;
C3(密文)≡M3(明文)^e (mod n) == 16≡25^3 mod 33;
所以密文為11.26.16。

密文解密。用戶B收到密文,若將其解密,只需要計算,即:
M1(明文)≡C1(密文)^d (mod n) == 11≡11^7 mod 33;
M2(明文)≡C2(密文)^d (mod n) == 05≡26^7 mod 33;
M3(明文)≡C3(密文)^d (mod n) == 25≡16^7 mod 33;
轉成明文11.05.25。根據上面的編碼表將其轉換為英文,我們又得到了恢復後的原文「key」。

當然,實際運用要比這復雜得多,由於RSA演算法的公鑰私鑰的長度(模長度)要到1024位甚至2048位才能保證安全,因此,p、q、e的選取、公鑰私鑰的生成,加密解密模指數運算都有一定的計算程序,需要仰仗計算機高速完成。

㈨ 如何使用RSA簽名給給信息加密和解密

{
publicstaticfinalStringKEY_ALGORITHM="RSA";
_ALGORITHM="MD5withRSA";

_KEY="RSAPublicKey";
_KEY="RSAPrivateKey";

/**
*用私鑰對信息生成數字簽名
*
*@paramdata
*加密數據
*@paramprivateKey
*私鑰
*
*@return
*@throwsException
*/
publicstaticStringsign(byte[]data,StringprivateKey)throwsException{
//解密由base64編碼的私鑰
byte[]keyBytes=decryptBASE64(privateKey);

//構造PKCS8EncodedKeySpec對象
=newPKCS8EncodedKeySpec(keyBytes);

//KEY_ALGORITHM指定的加密演算法
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//取私鑰匙對象
PrivateKeypriKey=keyFactory.generatePrivate(pkcs8KeySpec);

//用私鑰對信息生成數字簽名
Signaturesignature=Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);

returnencryptBASE64(signature.sign());
}

/**
*校驗數字簽名
*
*@paramdata
*加密數據
*@parampublicKey
*公鑰
*@paramsign
*數字簽名
*
*@return校驗成功返回true失敗返回false
*@throwsException
*
*/
publicstaticbooleanverify(byte[]data,StringpublicKey,Stringsign)
throwsException{

//解密由base64編碼的公鑰
byte[]keyBytes=decryptBASE64(publicKey);

//構造X509EncodedKeySpec對象
X509EncodedKeySpeckeySpec=newX509EncodedKeySpec(keyBytes);

//KEY_ALGORITHM指定的加密演算法
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);

//取公鑰匙對象
PublicKeypubKey=keyFactory.generatePublic(keySpec);

Signaturesignature=Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(pubKey);
signature.update(data);

//驗證簽名是否正常
returnsignature.verify(decryptBASE64(sign));
}

/**
*解密<br>
*用私鑰解密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]decryptByPrivateKey(byte[]data,Stringkey)
throwsException{
//對密鑰解密
byte[]keyBytes=decryptBASE64(key);

//取得私鑰
=newPKCS8EncodedKeySpec(keyBytes);
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
KeyprivateKey=keyFactory.generatePrivate(pkcs8KeySpec);

//對數據解密
Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE,privateKey);

returncipher.doFinal(data);
}

/**
*解密<br>
*用私鑰解密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]decryptByPublicKey(byte[]data,Stringkey)
throwsException{
//對密鑰解密
byte[]keyBytes=decryptBASE64(key);

//取得公鑰
X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(keyBytes);
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
KeypublicKey=keyFactory.generatePublic(x509KeySpec);

//對數據解密
Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE,publicKey);

returncipher.doFinal(data);
}

/**
*加密<br>
*用公鑰加密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]encryptByPublicKey(byte[]data,Stringkey)
throwsException{
//對公鑰解密
byte[]keyBytes=decryptBASE64(key);

//取得公鑰
X509EncodedKeySpecx509KeySpec=newX509EncodedKeySpec(keyBytes);
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
KeypublicKey=keyFactory.generatePublic(x509KeySpec);

//對數據加密
Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE,publicKey);

returncipher.doFinal(data);
}

/**
*加密<br>
*用私鑰加密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]encryptByPrivateKey(byte[]data,Stringkey)
throwsException{
//對密鑰解密
byte[]keyBytes=decryptBASE64(key);

//取得私鑰
=newPKCS8EncodedKeySpec(keyBytes);
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
KeyprivateKey=keyFactory.generatePrivate(pkcs8KeySpec);

//對數據加密
Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE,privateKey);

returncipher.doFinal(data);
}

/**
*取得私鑰
*
*@paramkeyMap
*@return
*@throwsException
*/
(Map<String,Object>keyMap)
throwsException{
Keykey=(Key)keyMap.get(PRIVATE_KEY);

returnencryptBASE64(key.getEncoded());
}

/**
*取得公鑰
*
*@paramkeyMap
*@return
*@throwsException
*/
(Map<String,Object>keyMap)
throwsException{
Keykey=(Key)keyMap.get(PUBLIC_KEY);

returnencryptBASE64(key.getEncoded());
}

/**
*初始化密鑰
*
*@return
*@throwsException
*/
publicstaticMap<String,Object>initKey()throwsException{
KeyPairGeneratorkeyPairGen=KeyPairGenerator
.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);

KeyPairkeyPair=keyPairGen.generateKeyPair();

//公鑰
RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();

//私鑰
RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();

Map<String,Object>keyMap=newHashMap<String,Object>(2);

keyMap.put(PUBLIC_KEY,publicKey);
keyMap.put(PRIVATE_KEY,privateKey);
returnkeyMap;
}
}

閱讀全文

與rsa簽名演算法相關的資料

熱點內容
sql服務停用命令 瀏覽:910
為什麼系統要用兩個雲伺服器 瀏覽:678
兩個pdf怎麼合並 瀏覽:293
php查詢為空 瀏覽:589
香港伺服器丟包了怎麼辦 瀏覽:46
linux系統管理教程 瀏覽:643
共享文件夾怎麼設置只讀文件 瀏覽:295
小米添加雲伺服器地址 瀏覽:581
qt入門pdf 瀏覽:670
視頻監控取消默認加密 瀏覽:294
雲伺服器怎麼設置輸入鍵盤 瀏覽:817
單片機支持多大mhz 瀏覽:42
linux啟動mysql命令 瀏覽:792
編程和游戲買什麼筆記本 瀏覽:902
程序員座點陣圖片大全 瀏覽:142
aix重啟命令 瀏覽:462
騰訊雲伺服器的後台 瀏覽:47
安卓怎麼定時打開軟體 瀏覽:598
笨手機應用加密怎麼刪除 瀏覽:97
為什麼vc6編譯是灰色 瀏覽:390