轉自:http://shuany.iteye.com/blog/730910
由 openssl產生的private key檔案如下:
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQDzxjNvQ4oUrDtPaPAnWiiixsiZSuNXIFhSwbKoaRWYLQSSCJPI
NuwCi2uRfQemOWp9EWUwxeQOwWxD3XUqZksCj7L7AUd8RXsIlB+Nejbw4KmSxbYn
39eGrf/ipWD4lrsUJMuuNi/QcIG3EsBjs63wxKzpA1+0diOAfHzXSJewTQIDAQAB
AoGBAND6GmHJrnemZnne5fF2UtuoOZNgJaAtNEpNjtDctQxtmzttavL6UjykNKTW
YFZZZjatUOgM3ULhAeTz1ltwsd9lzw+pF9CsyAOwyQNhjdO3VV+hmAinBm/32yPp
xkuqThS40pX5SRV5HZlLLm4dj90UA1bxrgr5LUQePPI9jzBBAkEA/7Q/9DDVKjie
f8Eeuh/ZElAjVve+DgmQJYkM2QOAHkCx2Zmw5hOq1TROVJUiJsSegSWWvMDnVA/w
bPboSFKOeQJBAPQOar6bj7EdSO5atrJg3jSA+SW/j30ljhERDOk3eI8bfgMYL7EG
QOG01VwoR3uyVEKY3n8i2WKGLuNwBe/Qa3UCQQCVODYeJaUwB2yPdz6cNVuy8Ss+
ZEL35CLHlMv3lLBedziSmLr/+Tg3RVf0yjbs0s8A5NOrgRM+HjMbE5eIJQ1ZAkEA
oWsPqvYUud5WqF+TSrPLBArxvsfOTcWTCzKtyWqI8I4McFuE3571NtN18rgpX2T5
Wfrl3kzcXs/FH2SuaIj/KQJBANFxrPGmyZNcGf0uiwm241+j3Pmy90+XUrmL1VYL
z1uGk3VsnRPo1SnO+f70zS3gfqodFk5Y9S0ZAj/p6uyeL2E=
-----END RSA PRIVATE KEY-----
用java代碼要從這個檔案中得到想要的priavtekey 可以先用命令
openssl pkcs8 -topk8 -inform PEM -outform DER -in rsa_pem.key -out pkcs8_der.key -nocrypt
對*.key檔案進行轉換,然後再讀轉換後的檔案
File file = new File(keyfile); //keyfile key檔案的地址
FileInputStream in = new FileInputStream(file);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] tmpbuf = new byte[1024];
int count = 0;
while ((count = in.read(tmpbuf)) != -1) {
bout.write(tmpbuf, 0, count);
tmpbuf = new byte[1024];
}
in.close();
把讀的輸入資料流轉變成自己想要的privatekey
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(bout.toByteArray());
RSAPrivateKey privateKey = (RSAPrivateKey)keyFactory.generatePrivate(privateKeySpec);
這樣就可以使用privatekey對自己的檔案進行加密了
//進行加密
Signature dsa = Signature.getInstance("SHA1withRSA"); //採用SHA1withRSA加密
dsa.initSign(privateKey);
dsa.update(voucher.getBytes()); //voucher需要加密的String必須變成byte類型的
byte[] sig = dsa.sign();
byRSA=toHexString(sig); //加密後的byte類型變成十六進位的String