日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

RSA体系 c++/java相互进行加签验签--转

發(fā)布時間:2025/4/5 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RSA体系 c++/java相互进行加签验签--转 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在web開發(fā)中,采用RSA公鑰密鑰體系自制ukey,文件證書登陸時,普遍的做法為:在瀏覽器端采用c++ activex控件,使用 c++的第三庫openssl進(jìn)行RAS加簽操作,在服務(wù)器端采用java對客戶端的簽名進(jìn)行驗簽操作。這就涉及到c++ openssl和java之間交互加簽驗簽對客戶端身份進(jìn)行驗證的過程。

? ? ? ?如果你通過搜索查到我這邊文章,相信你一定發(fā)現(xiàn),采用openssl加簽后的 數(shù)據(jù),在java端卻驗簽不成功,使用openssl驗簽可以通過。問題在于openssl的公鑰發(fā)在服務(wù)端轉(zhuǎn)換成java RSA 公鑰時有問題,openssl的公鑰格式里附加了它自己的一些額外信息。所以在服務(wù)端java構(gòu)造自己的pubkey時必須先剔除openssl的特有信息。

? ? ? ?例如如果我么采用openssl生成 modulus?size?為1024, exponent為65537 的公鑰秘鑰對---RSA_generate_key(1024, 65537, NULL, NULL);那么我們在java端通過openssl的公鑰構(gòu)造java格式的公鑰時,我們就必須采用如下方式獲得modulus ,然后采用java的方式構(gòu)造公鑰,進(jìn)行驗簽操作。

?

private static byte[] getModulus(byte[] pkData, int begin){

byte[] modData = new byte[128] ;

byte[] ss = {pkData[0],pkData[1],pkData[2],pkData[3]};

for(int i = 0, y = begin; i < 128; i++,y++){

modData[i] = pkData[y];

}

return modData;

}

?

/**

?* 從openssl中提起相關(guān)的128為的公鑰數(shù)據(jù)

?* @param b64Str

?* @return

?*/

private static byte[] get128PkData(String b64Str){

String pk = b64Str.replace("-----BEGIN RSA PUBLIC KEY-----", "");//剔除前面的信息

pk = pk.replace("-----END RSA PUBLIC KEY-----", "");// 剔除后面的信息

byte[] pkData = Base64.decode(pk);

return getModulus(pkData, 7);//下標(biāo)從7開始,獲得128 bytes的modulus

}

/** 如果你問我里邊到底加了一些什么信息,我也不知道,我是從下標(biāo)1開始不斷測試,才得出應(yīng)該從下標(biāo)7開始獲取modulus值 ***/

?

/**

?* 由1024位的公鑰轉(zhuǎn)換成x509格式的公鑰

?* @param modData

?* @return

?* @throws Exception

?*/

private static PublicKey getPublicKey(byte[] modData) throws Exception{

KeyFactory keyf = KeyFactory.getInstance("RSA");

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(modData), new BigInteger("65537"));

RSAPublicKey pk = (RSAPublicKey) keyf.generatePublic(pubKeySpec);

// 解密由base64編碼的公鑰,并構(gòu)造X509EncodedKeySpec對象

java.security.spec.X509EncodedKeySpec bobPubKeySpec = new java.security.spec.X509EncodedKeySpec(

pk.getEncoded());

return keyf.generatePublic(bobPubKeySpec);

}

至于openssl我就不再做介紹,網(wǎng)上有很多資料,而且它本身的文檔也很齊全

在后面附上一些相關(guān)的類, ?SignProvider.java 端負(fù)責(zé)公鑰轉(zhuǎn)換和加簽驗簽 ? ? Base64.java負(fù)責(zé)64為編碼 ? ?fcOpenSslRef.rar---Openssl相關(guān)類

注:本人對c++也不熟,所以上面的一些c++代碼只做參考。

原文:http://www.chlusoft.com/tech/347.jhtml

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3922508.html

總結(jié)

以上是生活随笔為你收集整理的RSA体系 c++/java相互进行加签验签--转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。