package rsa;
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;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* RSA安全编码组件
*
* @version 1.0
* @since 1.0
*/
public class RSACoder {
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>
* 用私钥解密 http://www.5a520.cn http://www.feng123.com
*
* @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 = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicKey = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/** *//**
* 加密<br>
* 用私钥加密
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(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.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/** *//**
* 取得私钥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return encryptBASE64(key.getEncoded());
}
/** *//**
* 取得公钥
*
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Object> keyMap)
throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return encryptBASE64(key.getEncoded());
}
/** *//**
* 初始化密钥
*
* @return
* @throws Exception
*/
public static Map<String, Object> initKey() 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;
}
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* BASE64加密
java 加密算法的代码实现



Java加密算法是信息安全领域的重要组成部分,它用于保护数据的隐私和完整性。在Java中,有多种加密技术可供选择,如消息摘要、对称加密、非对称加密以及数字签名。以下将详细介绍这些加密方法。 消息摘要算法,如MD5(Message-Digest Algorithm 5)和SHA(Secure Hash Algorithm)家族,包括SHA-1、SHA-256等,主要用于验证数据的完整性。MD5产生128位的散列值,而SHA家族则提供不同长度的散列,如SHA-1产生160位,SHA-256产生256位。这些算法将任意长度的数据转换为固定长度的摘要,若数据有任何改动,摘要值就会变化,从而检测到数据被篡改。 接下来,对称加密算法如DES(Data Encryption Standard)是一种常见的加密方式。它使用相同的密钥进行加密和解密,操作速度快,适合大量数据的加密。但DES仅使用56位的密钥,现代计算能力下容易被破解,因此现在通常使用其增强版3DES(Triple DES)或更安全的AES(Advanced Encryption Standard)。 非对称加密算法如RSA,是由Ron Rivest、Adi Shamir和Leonard Adleman提出的,它使用一对公钥和私钥。公钥可以公开,用于加密;私钥必须保密,用于解密。这种方式解决了密钥分发问题,增强了安全性,但相对于对称加密,其计算速度较慢。 数字签名算法如DSA(Digital Signature Algorithm)是基于非对称加密的,用于确保数据的完整性和发送者的身份。发送者使用私钥对消息的哈希值进行签名,接收者可以用发送者的公钥验证签名,确认信息未被篡改且来自正确的发送方。 在Java中,可以使用Java Cryptography Extension (JCE)框架来实现这些加密算法。例如,使用`java.security.MessageDigest`类处理MD5和SHA的摘要计算,`javax.crypto.Cipher`类实现DES、3DES和AES的加密解密,`java.security.KeyPairGenerator`和`java.security.Signature`类处理RSA的公钥私钥生成及数字签名。 在实际应用中,开发者需要根据具体需求选择合适的加密算法,考虑安全性和效率的平衡。例如,对于网络传输的敏感数据,可能需要先使用非对称加密交换对称密钥,然后用对称密钥进行数据加密,以兼顾安全与速度。同时,要注意遵循法律法规,如出口管制规定,确保所使用的加密强度符合标准。 Java提供的加密算法提供了丰富的工具,帮助开发者构建安全的应用环境。理解并熟练掌握这些算法的原理和使用方法,对于保障数据安全至关重要。在实际项目中,还需要关注算法的实现细节,以及不断发展的安全威胁,持续更新和优化加密策略。














































- 1

- 粉丝: 28
- 资源: 73
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 2025年AI技术从Deepseek到Manus:重塑企业价值与管理模式
- python2.7.18 源码
- fork 2.6 for windows all
- 基于Nodemcu智能蔬菜滴灌系统
- 練習無用的草稿11111111111111233333333
- 物联网工程、实验报告,智能家居
- 大模型概念、技术及其在多领域应用实践的全面解析
- Microsoft.Office.Interop.Excel.dll 用作C#操作打印机
- 大模型使用指南、DEEPSEEK实战指南
- zhengquan看看看咯
- 基于python的网络舆情分析系统
- Java开发Java 17新特性详解:密封类、模式匹配、文本块及性能优化综述
- 在学习Wpf的过程中,手搓了一个2048
- vivo Y55A/Y55L/Y55S 刷入 TWRP Recovery 和解锁bootloader
- 摄像头怎么显示在QT界面中,并且应用
- 通过QT去控制下位机灯的亮灭



- 1
- 2
- 3
- 4
前往页