首页
诗词
字典
板报
句子
名言
友答
励志
学校
网站地图
编程
C++
C语言
C++ Builder
VB
PB
Ruby Rails
perl python
编程
其他开发语言
VBA
VC/MFC
当前位置:
首页
>
教程频道
>
开发语言
>
编程
>
Java加密技术(4)
2012-12-24
Java加密技术(四)接下来我们介绍典型的非对称加密算法——RSA通过java代码实现如下:Coder类见Java代码import
Java加密技术(四)
接下来我们介绍典型的非对称加密算法——RSA
通过java代码实现如下:
Coder类见Java代码
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;??
??
/**?
?*?RSA安全编码组件?
?*??
?*?@author?梁栋?
?*?@version?1.0?
?*?@since?1.0?
?*/??
public?abstract?class?RSACoder?extends?Coder?{??
????public?static?final?String?KEY_ALGORITHM?=?"RSA";??
????public?static?final?String?SIGNATURE_ALGORITHM?=?"MD5withRSA";??
??
????private?static?final?String?PUBLIC_KEY?=?"RSAPublicKey";??
????private?static?final?String?PRIVATE_KEY?=?"RSAPrivateKey";??
??
????/**?
?????*?用私钥对信息生成数字签名?
?????*??
?????*?@param?data?
?????*????????????加密数据?
?????*?@param?privateKey?
?????*????????????私钥?
?????*??
?????*?@return?
?????*?@throws?Exception?
?????*/??
????public?static?String?sign(byte[]?data,?String?privateKey)?throws?Exception?{??
????????//?解密由base64编码的私钥??
????????byte[]?keyBytes?=?decryptBASE64(privateKey);??
??
????????//?构造PKCS8EncodedKeySpec对象??
????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec(keyBytes);??
??
????????//?KEY_ALGORITHM?指定的加密算法??
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);??
??
????????//?取私钥匙对象??
????????PrivateKey?priKey?=?keyFactory.generatePrivate(pkcs8KeySpec);??
??
????????//?用私钥对信息生成数字签名??
????????Signature?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM);??
????????signature.initSign(priKey);??
????????signature.update(data);??
??
????????return?encryptBASE64(signature.sign());??
????}??
??
????/**?
?????*?校验数字签名?
?????*??
?????*?@param?data?
?????*????????????加密数据?
?????*?@param?publicKey?
?????*????????????公钥?
?????*?@param?sign?
?????*????????????数字签名?
?????*??
?????*?@return?校验成功返回true?失败返回false?
?????*?@throws?Exception?
?????*??
?????*/??
????public?static?boolean?verify(byte[]?data,?String?publicKey,?String?sign)??
????????????throws?Exception?{??
??
????????//?解密由base64编码的公钥??
????????byte[]?keyBytes?=?decryptBASE64(publicKey);??
??
????????//?构造X509EncodedKeySpec对象??
????????X509EncodedKeySpec?keySpec?=?new?X509EncodedKeySpec(keyBytes);??
??
????????//?KEY_ALGORITHM?指定的加密算法??
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);??
??
????????//?取公钥匙对象??
????????PublicKey?pubKey?=?keyFactory.generatePublic(keySpec);??
??
????????Signature?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM);??
????????signature.initVerify(pubKey);??
????????signature.update(data);??
??
????????//?验证签名是否正常??
????????return?signature.verify(decryptBASE64(sign));??
????}??
??
????/**?
?????*?解密<br>?
?????*?用私钥解密?
?????*??
?????*?@param?data?
?????*?@param?key?
?????*?@return?
?????*?@throws?Exception?
?????*/??
????public?static?byte[]?decryptByPrivateKey(byte[]?data,?String?key)??
????????????throws?Exception?{??
????????//?对密钥解密??
????????byte[]?keyBytes?=?decryptBASE64(key);??
??
????????//?取得私钥??
????????PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec(keyBytes);??
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);??
????????Key?privateKey?=?keyFactory.generatePrivate(pkcs8KeySpec);??
??
????????//?对数据解密??
????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());??
????????cipher.init(Cipher.DECRYPT_MODE,?privateKey);??
??
????????return?cipher.doFinal(data);??
????}??
??
????/**?
?????*?解密<br>?
?????*?用私钥解密?
?????*??
?????*?@param?data?
?????*?@param?key?
?????*?@return?
?????*?@throws?Exception?
?????*/??
????public?static?byte[]?decryptByPublicKey(byte[]?data,?String?key)??
????????????throws?Exception?{??
????????//?对密钥解密??
????????byte[]?keyBytes?=?decryptBASE64(key);??
??
????????//?取得公钥??
????????X509EncodedKeySpec?x509KeySpec?=?new?X509EncodedKeySpec(keyBytes);??
????????KeyFactory?keyFactory?=?KeyFactory.getInstance(KEY_ALGORITHM);??
????????Key?publicKey?=?keyFactory.generatePublic(x509KeySpec);??
??
????????//?对数据解密??
????????Cipher?cipher?=?Cipher.getInstance(keyFactory.getAlgorithm());??
????????cipher.init(Cipher.DECRYPT_MODE,?publicKey);??
??
????????return?cipher.doFinal(data);??
????}??
??
????/**?
?????*?加密<br>?
?????*?用公钥加密?
?????*??
?????*?@param?data?
?????*?@param?key?
?????*?@return?
?????*?@throws?Exception?
?????*/??
????public?static?byte[]?encryptByPublicKey(byte[]?data,?String?key)??
????????????throws?Exception?{??
????????//?对公钥解密??
????????byte[]?keyBytes?=?decryptBASE64(key);??
??
????????//?取得公钥??
????????X509EncodedKeySpec?x509KeySpec
查看更多
下一篇
本文网址:
https://www.reader8.net/jiaocheng/20121224/1844826.html
读书人精选
热点排行
用log4j进展记录日志
Java定时任务的兑现(转)
【口试】HashTable和HashMap的区别
经过final变量实现条件编译
poj 1113 wall (凸包有关问题)
Spring对事务管理的支持的发展进程(基础
DataGrid当鼠标划过每行时,在ToolTip中
java字节码结构对象为什么需要dup命令
Hibernate(HQL) 子查询 formula公式应用
步骤的重写和重载