RSA體系 c++/java相互進行加簽驗籤--轉

在web開發中,採用RSA公鑰密鑰體系自制ukey,文件證書登錄時,廣泛的作法爲:在瀏覽器端採用c++ activex控件,使用 c++的第三庫openssl進行RAS加簽操做,在服務器端採用java對客戶端的簽名進行驗籤操做。這就涉及到c++ openssl和java之間交互加簽驗籤對客戶端身份進行驗證的過程。html

       若是你經過搜索查到我這邊文章,相信你必定發現,採用openssl加簽後的 數據,在java端卻驗籤不成功,使用openssl驗籤能夠經過。問題在於openssl的公鑰發在服務端轉換成java RSA 公鑰時有問題,openssl的公鑰格式裏附加了它本身的一些額外信息。因此在服務端java構造本身的pubkey時必須先剔除openssl的特有信息。java

       例如若是我麼採用openssl生成 modulus size 爲1024, exponent爲65537 的公鑰祕鑰對---RSA_generate_key(1024, 65537, NULL, NULL);那麼咱們在java端經過openssl的公鑰構造java格式的公鑰時,咱們就必須採用以下方式得到modulus ,而後採用java的方式構造公鑰,進行驗籤操做。c++

 

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

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++){ide

modData[i] = pkData[y];測試

}編碼

return modData;spa

}

 

/**

 * 從openssl中提起相關的128爲的公鑰數據

 * @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);//下標從7開始,得到128 bytes的modulus

}

/** 若是你問我裏邊到底加了一些什麼信息,我也不知道,我是從下標1開始不斷測試,才得出應該從下標7開始獲取modulus值 ***/

 

/**

 * 由1024位的公鑰轉換成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編碼的公鑰,並構造X509EncodedKeySpec對象

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

pk.getEncoded());

return keyf.generatePublic(bobPubKeySpec);

}

至於openssl我就再也不作介紹,網上有不少資料,並且它自己的文檔也很齊全

在後面附上一些相關的類,  SignProvider.java 端負責公鑰轉換和加簽驗籤     Base64.java負責64爲編碼    fcOpenSslRef.rar---Openssl相關類

注:本人對c++也不熟,因此上面的一些c++代碼只作參考。

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

相關文章
相關標籤/搜索