『壹』 求這張圖片的連接,我要弄百度貼吧簽名檔,連接要完整,拜託了
1、https://gss0..com/-Po3dSag_xI4khGko9WTAnF6hhy//wh%3D600%2C800/sign=/.jpg
2、https://gss0..com/-vo3dSag_xI4khGko9WTAnF6hhy//wh%3D600%2C800/sign=/.jpg
3、https://gss0..com/94o3dSag_xI4khGko9WTAnF6hhy//wh%3D600%2C800/sign=/.jpg
4、https://gss0..com/9vo3dSag_xI4khGko9WTAnF6hhy//wh%3D600%2C800/sign=/.jpg
5、https://gss0..com/-4o3dSag_xI4khGko9WTAnF6hhy//wh%3D600%2C800/sign=/.jpg
『貳』 簽名演算法怎麼來的
數字簽名演算法分析與Hash簽名
序:這篇文章我用了近一周的時間完成,其中涉及到的RSA演算法已經在上一篇《公鑰密碼體系》中詳細的介紹過,目前數字簽名中人們使用很多的還是512位與1024位的RSA演算法。
摘要: 數字簽字和認證機構是電子商務的核心技術。數字簽名作為目前Internet中電子商務重要的技術,不斷地進行改進,標准化。本文從數字簽名的意義出發,詳細介紹了數字簽名中涉及到的內容與演算法,並自行結合進行改進。
關鍵詞:Internet公鑰加密 Hash函數 電子商務加密數字簽名
數字簽名簡介
我們對加解密演算法已經有了一定理解,可以進一步討論"數字簽名"(注意不要與數字認證混淆)的問題了,即如何給一個計算機文件進行簽字。數字簽字可以用對稱演算法實現,也可以用公鑰演算法實現。但前者除了文件簽字者和文件接受者雙方,還需要第三方認證,較麻煩;通過公鑰加密演算法的實現方法,由於用秘密密鑰加密的文件,需要靠公開密鑰來解密,因此這可以作為數字簽名,簽名者用秘密密鑰加密一個簽名(可以包括姓名、證件號碼、簡訊息等信息),接收人可以用公開的、自己的公開密鑰來解密,如果成功,就能確保信息來自該公開密鑰的所有人。
公鑰密碼體制實現數字簽名的基本原理很簡單,假設A要發送一個電子文件給B,A、B雙方只需經過下面三個步驟即可:
1. A用其私鑰加密文件,這便是簽字過程
2. A將加密的文件送到B
3. B用A的公鑰解開A送來的文件
這樣的簽名方法是符合可靠性原則的。即:
簽字是可以被確認的,
簽字是無法被偽造的,
簽字是無法重復使用的,
文件被簽字以後是無法被篡改的,
簽字具有無可否認性,
數字簽名就是通過一個單向函數對要傳送的報文進行處理得到的用以認證報文來源並核實報文是否發生變化的一個字母數字串。用這幾個字元串來代替書寫簽名或印章,起到與書寫簽名或印章同樣的法律效用。國際社會已開始制定相應的法律、法規,把數字簽名作為執法的依據。
數字簽名的實現方法
實現數字簽名有很多方法,目前數字簽名採用較多的是公鑰加密技術,如基於RSA Data Security公司的PKCS(Public Key Cryptography Standards)、DSA(Digital Signature Algorithm)、x.509、PGP(Pretty Good Privacy)。1994年美國標准與技術協會公布了數字簽名標准(DSS)而使公鑰加密技術廣泛應用。同時應用散列演算法(Hash)也是實現數字簽名的一種方法。
非對稱密鑰密碼演算法進行數字簽名
演算法的含義:
非對稱密鑰密碼演算法使用兩個密鑰:公開密鑰和私有密鑰,分別用於對數據的加密和解密,即如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能進行解密;如果用私有密鑰對數據進行加密,則只有用對應的公開密鑰才能解密。
使用公鑰密碼演算法進行數字簽名通用的加密標准有: RSA,DSA,Diffie-Hellman等。
簽名和驗證過程:
發送方(甲)首先用公開的單向函數對報文進行一次變換,得到數字簽名,然後利用私有密鑰對數字簽名進行加密後附在報文之後一同發出。
接收方(乙)用發送方的公開密鑰對數字簽名進行解密交換,得到一個數字簽名的明文。發送方的公鑰可以由一個可信賴的技術管理機構即認證中心(CA)發布的。
接收方將得到的明文通過單向函數進行計算,同樣得到一個數字簽名,再將兩個數字簽名進行對比,如果相同,則證明簽名有效,否則無效。
這種方法使任何擁有發送方公開密鑰的人都可以驗證數字簽名的正確性。由於發送方私有密鑰的保密性,使得接受方既可以根據結果來拒收該報文,也能使其無法偽造報文簽名及對報文進行修改,原因是數字簽名是對整個報文進行的,是一組代表報文特徵的定長代碼,同一個人對不同的報文將產生不同的數字簽名。這就解決了銀行通過網路傳送一張支票,而接收方可能對支票數額進行改動的問題,也避免了發送方逃避責任的可能性。
對稱密鑰密碼演算法進行數字簽名
演算法含義
對稱密鑰密碼演算法所用的加密密鑰和解密密鑰通常是相同的,即使不同也可以很容易地由其中的任意一個推導出另一個。在此演算法中,加、解密雙方所用的密鑰都要保守秘密。由於計算機速度而廣泛應用於大量數據如文件的加密過程中,如RD4和DES,用IDEA作數字簽名是不提倡的。
使用分組密碼演算法數字簽名通用的加密標准有:DES,Tripl-DES,RC2,RC4,CAST等。
簽名和驗證過程
Lamport發明了稱為Lamport-Diffle的對稱演算法:利用一組長度是報文的比特數(n)兩倍的密鑰A,來產生對簽名的驗證信息,即隨機選擇2n個數B,由簽名密鑰對這2n個數B進行一次加密交換,得到另一組2n個數C。
發送方從報文分組M的第一位開始,依次檢查M的第I位,若為0時,取密鑰A的第i位,若為1則取密鑰A的第i+1位;直至報文全部檢查完畢。所選取的n個密鑰位形成了最後的簽名。
接受方對簽名進行驗證時,也是首先從第一位開始依次檢查報文M,如果M的第i位為0時,它就認為簽名中的第i組信息是密鑰A的第i位,若為1則為密鑰A的第i+1位;直至報文全部驗證完畢後,就得到了n個密鑰,由於接受方具有發送方的驗證信息C,所以可以利用得到的n個密鑰檢驗驗證信息,從而確認報文是否是由發送方所發送。
這種方法由於它是逐位進行簽名的,只有有一位被改動過,接受方就得不到正確的數字簽名,因此其安全性較好,其缺點是:簽名太長(對報文先進行壓縮再簽名,可以減少簽名的長度);簽名密鑰及相應的驗證信息不能重復使用,否則極不安全。
結合對稱與非對稱演算法的改進
對稱演算法與非對稱演算法各有利弊,所以結合各自的優缺點進行改進,可以用下面的模塊進行說明:
Hash演算法進行數字簽名
Hash演算法也稱作散列演算法或報文摘要,Hash演算法將在數字簽名演算法中詳細說明。
Hash演算法數字簽字通用的加密標准有: SHA-1,MD5等。
數字簽名演算法
數字簽名的演算法很多,應用最為廣泛的三種是: Hash簽名、DSS簽名、RSA簽名。這三種演算法可單獨使用,也可綜合在一起使用。數字簽名是通過密碼演算法對數據進行加、解密變換實現的,常用的HASH演算法有MD2、MD5、SHA-1,用DES演算法、RSA演算法都可實現數字簽名。但或多或少都有缺陷,或者沒有成熟的標准。
Hash簽名
Hash簽名是最主要的數字簽名方法,也稱之為數字摘要法(digital digest)、數字指紋法(digital finger print)。它與RSA數字簽名是單獨的簽名不同,該數字簽名方法是將數字簽名與要發送的信息緊密聯系在一起,它更適合於電子商務活動。將一個商務合同的個體內容與簽名結合在一起,比合同和簽名分開傳遞,更增加了可信度和安全性。下面我們將詳細介紹Hash簽名中的函數與演算法。
『叄』 數字簽名的原理
數字簽名是附加在數據單元上的一些數據,或是對數據單元所作的密碼變換。這種數據或變換允許數據單元的接收者用以確認數據單元的來源和數據單元的完整性並保護數據,防止被人(例如接收者)進行偽造。
它是對電子形式的消息進行簽名的一種方法,一個簽名消息能在一個通信網路中傳輸。基於公鑰密碼體制和私鑰密碼體制都可以獲得數字簽名,主要是基於公鑰密碼體制的數字簽名。包括普通數字簽名和特殊數字簽名。
(3)貼吧sign演算法擴展閱讀:
實現方法
數字簽名演算法依靠公鑰加密技術來實現的。在公鑰加密技術里,每一個使用者有一對密鑰:一把公鑰和一把私鑰。公鑰可以自由發布,但私鑰則秘密保存;還有一個要求就是要讓通過公鑰推算出私鑰的做法不可能實現。
普通的數字簽名演算法包括三種演算法:
1.密碼生成演算法;
2.標記演算法;
3.驗證演算法。
『肆』 c語言中 sign
這里只是做一個標識符來使用而已
同樓上的,實現+-替換用附值語句:
while(……)
{
sign*=-1; // sign=-1*sign
……
}
//sign不是c語言的庫函數,
sign(z,p); //表示對一個名為sign的函數調用,傳遞參數是變數z,p。
『伍』 RSA的公鑰和私鑰到底哪個才是用來加密和哪個用來解密
我們來回顧一下RSA的加密演算法。我們從公鑰加密演算法和簽名演算法的定義出發,用比較規范的語言來描述這一演算法。
RSA公鑰加密體制包含如下3個演算法:KeyGen(密鑰生成演算法),Encrypt(加密演算法)以及Decrypt(解密演算法)。
(PK, SK)\leftarrow KeyGen(\lambda)。密鑰生成演算法以安全常數\lambda作為輸入,輸出一個公鑰PK,和一個私鑰SK。安全常數用於確定這個加密演算法的安全性有多高,一般以加密演算法使用的質數p的大小有關。\lambda越大,質數p一般越大,保證體制有更高的安全性。在RSA中,密鑰生成演算法如下:演算法首先隨機產生兩個不同大質數p和q,計算N=pq。隨後,演算法計算歐拉函數\varphi(N)=(p-1)(q-1)。接下來,演算法隨機選擇一個小於\varphi(N)的整數e,並計算e關於\varphi(N)的模反元素d。最後,公鑰為PK=(N, e),私鑰為SK=(N, d)。
CT \leftarrow Encrypt(PK,M)。加密演算法以公鑰PK和待加密的消息M作為輸入,輸出密文CT。在RSA中,加密演算法如下:演算法直接輸出密文為CT=M^e \mod \varphi(N)
M \leftarrow Decrypt(SK,CT)。解密演算法以私鑰SK和密文CT作為輸入,輸出消息M。在RSA中,解密演算法如下:演算法直接輸出明文為M=CT^d \mod \varphi(N)。由於e和d在\varphi(N)下互逆,因此我們有:CT^d=M^{ed}=M\mod \varphi(N)
所以,從演算法描述中我們也可以看出:公鑰用於對數據進行加密,私鑰用於對數據進行解密。當然了,這個也可以很直觀的理解:公鑰就是公開的密鑰,其公開了大家才能用它來加密數據。私鑰是私有的密鑰,誰有這個密鑰才能夠解密密文。否則大家都能看到私鑰,就都能解密,那不就亂套了。
=================分割線=================
我們再來回顧一下RSA簽名體制。簽名體制同樣包含3個演算法:KeyGen(密鑰生成演算法),Sign(簽名演算法),Verify(驗證演算法)。
(PK,SK) \leftarrow KeyGen(\lambda)。密鑰生成演算法同樣以安全常數\lambda作為輸入,輸出一個公鑰PK和一個私鑰SK。在RSA簽名中,密鑰生成演算法與加密演算法完全相同。
\sigma \leftarrow Sign(SK,M)。簽名演算法以私鑰SK和待簽名的消息M作為輸入,輸出簽名\sigma。在RSA簽名中,簽名演算法直接輸出簽名為\sigma = M^d \mod \varphi(N)。注意,簽名演算法和RSA加密體制中的解密演算法非常像。
b \leftarrow Verify(PK,\sigma,M)。驗證演算法以公鑰PK,簽名\sigma以及消息M作為輸入,輸出一個比特值b。b=1意味著驗證通過。b=0意味著驗證不通過。在RSA簽名中,驗證演算法首先計算M'=\sigma^e \mod \varphi(N),隨後對比M'與M,如果相等,則輸出b=1,否則輸出b=0。注意:驗證演算法和RSA加密體制中的加密演算法非常像。
所以,在簽名演算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。這也可以直觀地進行理解:對一個文件簽名,當然要用私鑰,因為我們希望只有自己才能完成簽字。驗證過程當然希望所有人都能夠執行,大家看到簽名都能通過驗證證明確實是我自己簽的。
=================分割線=================
那麼,為什麼題主問這么一個問題呢?我們可以看到,RSA的加密/驗證,解密/簽字過程太像了。同時,RSA體制本身就是對稱的:如果我們反過來把e看成私鑰,d看成公鑰,這個體制也能很好的執行。我想正是由於這個原因,題主在學習RSA體制的時候才會出現這種混亂。那麼解決方法是什麼呢?建議題主可以學習一下其他的公鑰加密體制以及簽名體制。其他的體制是沒有這種對稱性質的。舉例來說,公鑰加密體制的話可以看一看ElGamal加密,以及更安全的Cramer-Shoup加密。簽名體制的話可以進一步看看ElGamal簽名,甚至是BLS簽名,這些體制可能能夠幫助題主更好的弄清加密和簽名之間的區別和潛在的聯系。
至於題主問的加密和簽名是怎麼結合的。這種體制叫做簽密方案(SignCrypt),RSA中,這種簽密方案看起來特別特別像,很容易引起混亂。在此我不太想詳細介紹RSA中的加密與簽字結合的方案。我想提醒題主的是,加密與簽字結合時,兩套公私鑰是不同的。
『陸』 android開發微信支付集成客戶端二次簽名怎麼做
1.客戶端代碼得到用戶購買的商品信息,將之傳給自己公司app伺服器,參數包含但不限於以下:
params.put("appid", appID);// 微信appid,選擇性上傳,伺服器寫死亦可
params.put("money", money);// 支付金額,單位:分
params.put("name", goodsName);// 商品名稱
params.put("currencytype", "CNY");// 支付幣種,只能填CNY,代表人民幣12341234
備註:以上是參數欄位是我們公司伺服器定義,給伺服器用以獲取預支付訂單號prePayId用。
備注2:詳細欄位請參考:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
2.app伺服器調用微信「統一下單」介面,得到prePayId訂單號並返回prePayId給手機客戶端;
3.手機客戶端使用prePayId及商品信息調起微信客戶端進行支付;
3.1用戶操作:輸入密碼進行支付;返回鍵取消支付;網路無連接支付失敗等;
4.微信客戶端回調支付結果給咱們的APP客戶端;
5.微信伺服器非同步通知咱們公司app伺服器支付結果(伺服器的工作,與客戶端無關)
這個其實很簡單的,demo文檔寫得很詳細,直接上代碼吧:
/**
* 獲取sign簽名
*
* @return
*/
private String genPayReq() {
// 獲取參數的值
PayReq request = new PayReq();
request.appId = ConstantsMember.APP_ID;
request.partnerId = ConstantsMember.MCHID;
request.prepayId = mPrepayId;
request.packageValue = "Sign=WXPay";
request.nonceStr = DataUtil.getGuid();
request.timeStamp = DataUtil.getTimeStamp();
// 把參數的值傳進去SortedMap集合裡面
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
// {appid=wx34df375d7dae8c90, noncestr=,
// package=Sign=WXPay, partnerid=1349967601,
// prepayid=, timestamp=1468031760}
parameters.put("appid", request.appId);
parameters.put("noncestr", request.nonceStr);
parameters.put("package", request.packageValue);
parameters.put("partnerid", request.partnerId);
parameters.put("prepayid", request.prepayId);
parameters.put("timestamp", request.timeStamp);
String characterEncoding = "UTF-8";
String mySign = createSign(characterEncoding, parameters);
System.out.println("我的簽名是:" + mySign);
return mySign;
}
/**
* 微信支付簽名演算法sign
*
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign(String characterEncoding,
SortedMap<Object, Object> parameters) {
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();// 所有參與傳參的參數按照accsii排序(升序)
Iterator it = es.iterator();
while (it.hasNext()) {
@SuppressWarnings("rawtypes")
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
Object v = entry.getValue();
if (null != v && !"".equals(v) && !"sign".equals(k)
&& !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + ConstantsMember.KEY); //KEY是商戶秘鑰
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding)
.toUpperCase();
return sign; //
//
}
『柒』 c語言題目,演算法看不懂,還有裡面的sigh和sum等都是什麼意思啊~!希望一步一步的說清楚,先謝啦~!
看來這個問題難住你的不是演算法本身,而是英文, 程序員需要良好的英語基礎和數學基礎。
sign:
中文含義 為符號, 用來代表這個演算法裡面的當前 正負號;
sum:
中文含義為總和, 用來代表求和的和。
deno:
denominator 的縮寫,denominator中文含義為分母。
有了上面的解釋,這個演算法的偽代碼相信就很容易懂了
1-1/2+1/3-1/4+.....1/99-1/100
= 1 + (-1)(1/2)+ 1/3 + (-1)(1/4) + ... + 1/99 + (-1)(1/100)
S1: 設為正數
S2: 和 = 1 //加上第一個數
S3: 分母為2 // 為了接著計算 (-1)(1/2)
S4: 正負變號//對應上面的算式每項輪流反號
S5:讓term 為當前項 //現在是 (-1)(1/2)
S6: 這步寫錯了,應該是sum = sum + term, 即在和上加上當前項(-1)(1/2),於是計算出了 1 + (-1)(1/2)的值了,目前
S7: 分母+1//為了計算 後面的1/3
S8: 如果分母小於等於100, 返回S4,這樣可以繼續計算並累加後面的項; 否則,當前的sum里已經包含了所有項的和了,結束。
『捌』 java下的sign()函數,怎麼用python的語言實現呢希望詳細點,如果回答的好,一定追加分~!
先小小的提示下,直接說sign()誰也想不到是什麼,應該是Signature類的一個方法吧,做數字簽名用的。
java好像是自己實現了一些數字簽名的演算法,python數字簽名的函數還不大清楚。如果想自己實現,很簡答,看看java的源碼,然後用python再寫一遍。