Java公钥私钥签名工具包应用实例
- 摘要:packagecom.locator.encryption;importjava.io.ByteArrayOutputStream;importjava.security.Key;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey
- 标签:工具 Java 应用 实例
monospace !important; border: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; color: #006699 !important; float: none !important; height: auto !important; line-height: 1.1em !important; overflow: visible !important; vertical-align: baseline !important; width: auto !important; font-weight: bold !important; background: none !important;" class="java keyword">package?
com.locator.encryption;
?
import?
java.io.ByteArrayOutputStream;
import?
java.security.Key;
import?
java.security.KeyFactory;
import?
java.security.KeyPair;
import?
java.security.KeyPairGenerator;
import?
java.security.PrivateKey;
import?
java.security.PublicKey;
import?
java.security.Signature;
import?
java.security.interfaces.RSAPrivateKey;
import?
java.security.interfaces.RSAPublicKey;
import?
java.security.spec.PKCS8EncodedKeySpec;
import?
java.security.spec.X509EncodedKeySpec;
import?
java.util.HashMap;
import?
java.util.Map;
?
import?
javax.crypto.Cipher;
?
/**
?*?<p>
?*?RSA公钥/私钥/签名工具包
?*?<p>
?*?字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式<br/>
?*?由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,<br/>
?*?非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全
?*?</p>
?*?
?*/
public?
class?
RSAUtils{
?
????/**
?????*?加密算法RSA
?????*/
????public?
static?
final?
String?KEY_ALGORITHM?=?"RSA";
?????
????/**
?????*?签名算法
?????*/
????public?
static?
final?
String?SIGNATURE_ALGORITHM?=?"MD5withRSA";
?
????/**
?????*?获取公钥的key
?????*/
????private?
static?
final?
String?PUBLIC_KEY?=?"LocatorPublicKey";
?????
????/**
?????*?获取私钥的key
?????*/
????private?
static?
final?
String?PRIVATE_KEY?=?"LocatorPrivateKey";
?????
????/**
?????*?RSA最大加密明文大小
?????*/
????private?
static?
final?
int?
MAX_ENCRYPT_BLOCK?=?117;
?????
????/**
?????*?RSA最大解密密文大小
?????*/
????private?
static?
final?
int?
MAX_DECRYPT_BLOCK?=?128;
?
????/**
?????*?<p>
?????*?生成密钥对(公钥和私钥)
?????*?</p>
?????*?
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
Map<String,?Object>?genKeyPair()?throws?
Exception?{
????????KeyPairGenerator?keyPairGen?=?KeyPairGenerator.getInstance(KEY_ALGORITHM);
????????keyPairGen.initialize(1024);
????????KeyPair?keyPair?=?keyPairGen.generateKeyPair();
????????RSAPublicKey?publicKey?=?(RSAPublicKey)?keyPair.getPublic();
????????RSAPrivateKey?privateKey?=?(RSAPrivateKey)?keyPair.getPrivate();
????????Map<String,?Object>?keyMap?=?new?
HashMap<String,?Object>(2);
????????keyMap.put(PUBLIC_KEY,?publicKey);
????????keyMap.put(PRIVATE_KEY,?privateKey);
????????return?
keyMap;
????}
?????
????/**
?????*?<p>
?????*?用私钥对信息生成数字签名
?????*?</p>
?????*?
?????*?@param?data?已加密数据
?????*?@param?privateKey?私钥(BASE64编码)
?????*?
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
String?sign(byte[]?data,?String?privateKey)?throws?
Exception?{
????????byte[]?keyBytes?=?Base64Utils.decode(privateKey);
????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?
PKCS8EncodedKeySpec(keyBytes);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????PrivateKey?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec);
????????Signature?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM);
????????signature.initSign(privateK);
????????signature.update(data);
????????return?
Base64Utils.encode(signature.sign());
????}
?
????/**
?????*?<p>
?????*?校验数字签名
?????*?</p>
?????*?
?????*?@param?data?已加密数据
?????*?@param?publicKey?公钥(BASE64编码)
?????*?@param?sign?数字签名
?????*?
?????*?@return
?????*?@throws?Exception
?????*?
?????*/
????public?
static?
boolean?
verify(byte[]?data,?String?publicKey,?String?sign)
????????????throws?
Exception?{
????????byte[]?keyBytes?=?Base64Utils.decode(publicKey);
????????X509EncodedKeySpec?keySpec?=?new?
X509EncodedKeySpec(keyBytes);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????PublicKey?publicK?=?keyFactory.generatePublic(keySpec);
????????Signature?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM);
????????signature.initVerify(publicK);
????????signature.update(data);
????????return?
signature.verify(Base64Utils.decode(sign));
????}
?
????/**
?????*?<P>
?????*?私钥解密
?????*?</p>
?????*?
?????*?@param?encryptedData?已加密数据
?????*?@param?privateKey?私钥(BASE64编码)
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
byte[]?decryptByPrivateKey(byte[]?encryptedData,?String?privateKey)
????????????throws?
Exception?{
????????byte[]?keyBytes?=?Base64Utils.decode(privateKey);
????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?
PKCS8EncodedKeySpec(keyBytes);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????Key?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec);
????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());
????????cipher.init(Cipher.DECRYPT_MODE,?privateK);
????????int?
inputLen?=?encryptedData.length;
????????ByteArrayOutputStream?out?=?new?
ByteArrayOutputStream();
????????int?
offSet?=?0;
????????byte[]?cache;
????????int?
i?=?0;
????????
????????while?
(inputLen?-?offSet?>?0)?{
????????????if?
(inputLen?-?offSet?>?MAX_DECRYPT_BLOCK)?{
????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?MAX_DECRYPT_BLOCK);
????????????}?else?
{
????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?inputLen?-?offSet);
????????????}
????????????out.write(cache,?0,?cache.length);
????????????i++;
????????????offSet?=?i?*?MAX_DECRYPT_BLOCK;
????????}
????????byte[]?decryptedData?=?out.toByteArray();
????????out.close();
????????return?
decryptedData;
????}
?
????/**
?????*?<p>
?????*?公钥解密
?????*?</p>
?????*?
?????*?@param?encryptedData?已加密数据
?????*?@param?publicKey?公钥(BASE64编码)
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
byte[]?decryptByPublicKey(byte[]?encryptedData,?String?publicKey)
????????????throws?
Exception?{
????????byte[]?keyBytes?=?Base64Utils.decode(publicKey);
????????X509EncodedKeySpec?x509KeySpec?=?new?
X509EncodedKeySpec(keyBytes);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????Key?publicK?=?keyFactory.generatePublic(x509KeySpec);
????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());
????????cipher.init(Cipher.DECRYPT_MODE,?publicK);
????????int?
inputLen?=?encryptedData.length;
????????ByteArrayOutputStream?out?=?new?
ByteArrayOutputStream();
????????int?
offSet?=?0;
????????byte[]?cache;
????????int?
i?=?0;
????????
????????while?
(inputLen?-?offSet?>?0)?{
????????????if?
(inputLen?-?offSet?>?MAX_DECRYPT_BLOCK)?{
????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?MAX_DECRYPT_BLOCK);
????????????}?else?
{
????????????????cache?=?cipher.doFinal(encryptedData,?offSet,?inputLen?-?offSet);
????????????}
????????????out.write(cache,?0,?cache.length);
????????????i++;
????????????offSet?=?i?*?MAX_DECRYPT_BLOCK;
????????}
????????byte[]?decryptedData?=?out.toByteArray();
????????out.close();
????????return?
decryptedData;
????}
?
????/**
?????*?<p>
?????*?公钥加密
?????*?</p>
?????*?
?????*?@param?data?源数据
?????*?@param?publicKey?公钥(BASE64编码)
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
byte[]?encryptByPublicKey(byte[]?data,?String?publicKey)
????????????throws?
Exception?{
????????byte[]?keyBytes?=?Base64Utils.decode(publicKey);
????????X509EncodedKeySpec?x509KeySpec?=?new?
X509EncodedKeySpec(keyBytes);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????Key?publicK?=?keyFactory.generatePublic(x509KeySpec);
????????
????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());
????????cipher.init(Cipher.ENCRYPT_MODE,?publicK);
????????int?
inputLen?=?data.length;
????????ByteArrayOutputStream?out?=?new?
ByteArrayOutputStream();
????????int?
offSet?=?0;
????????byte[]?cache;
????????int?
i?=?0;
????????
????????while?
(inputLen?-?offSet?>?0)?{
????????????if?
(inputLen?-?offSet?>?MAX_ENCRYPT_BLOCK)?{
????????????????cache?=?cipher.doFinal(data,?offSet,?MAX_ENCRYPT_BLOCK);
????????????}?else?
{
????????????????cache?=?cipher.doFinal(data,?offSet,?inputLen?-?offSet);
????????????}
????????????out.write(cache,?0,?cache.length);
????????????i++;
????????????offSet?=?i?*?MAX_ENCRYPT_BLOCK;
????????}
????????byte[]?encryptedData?=?out.toByteArray();
????????out.close();
????????return?
encryptedData;
????}
?
????/**
?????*?<p>
?????*?私钥加密
?????*?</p>
?????*?
?????*?@param?data?源数据
?????*?@param?privateKey?私钥(BASE64编码)
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
byte[]?encryptByPrivateKey(byte[]?data,?String?privateKey)
????????????throws?
Exception?{
????????byte[]?keyBytes?=?Base64Utils.decode(privateKey);
????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?
PKCS8EncodedKeySpec(keyBytes);
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);
????????Key?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec);
????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());
????????cipher.init(Cipher.ENCRYPT_MODE,?privateK);
????????int?
inputLen?=?data.length;
????????ByteArrayOutputStream?out?=?new?
ByteArrayOutputStream();
????????int?
offSet?=?0;
????????byte[]?cache;
????????int?
i?=?0;
????????
????????while?
(inputLen?-?offSet?>?0)?{
????????????if?
(inputLen?-?offSet?>?MAX_ENCRYPT_BLOCK)?{
????????????????cache?=?cipher.doFinal(data,?offSet,?MAX_ENCRYPT_BLOCK);
????????????}?else?
{
????????????????cache?=?cipher.doFinal(data,?offSet,?inputLen?-?offSet);
????????????}
????????????out.write(cache,?0,?cache.length);
????????????i++;
????????????offSet?=?i?*?MAX_ENCRYPT_BLOCK;
????????}
????????byte[]?encryptedData?=?out.toByteArray();
????????out.close();
????????return?
encryptedData;
????}
?
????/**
?????*?<p>
?????*?获取私钥
?????*?</p>
?????*?
?????*?@param?keyMap?密钥对
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
String?getPrivateKey(Map<String,?Object>?keyMap)
????????????throws?
Exception?{
????????Key?key?=?(Key)?keyMap.get(PRIVATE_KEY);
????????return?
Base64Utils.encode(key.getEncoded());
????}
?
????/**
?????*?<p>
?????*?获取公钥
?????*?</p>
?????*?
?????*?@param?keyMap?密钥对
?????*?@return
?????*?@throws?Exception
?????*/
????public?
static?
String?getPublicKey(Map<String,?Object>?keyMap)
????????????throws?
Exception?{
????????Key?key?=?(Key)?keyMap.get(PUBLIC_KEY);
????????return?
Base64Utils.encode(key.getEncoded());
????}
?
}