- 浏览: 49803 次
文章分类
最新评论
1. 加密的作用
1)明文变密文(你不知道密钥是很难解密的);
2)数据的一致性(hash值一样);
3)数据的可信任性(验签)。
2. 两种不同的加密与解密
1)对称加密:加密与解密使用相同的密钥,处理速度快;
2)非对称加密:加密与解密使用不同的密钥(生对生成),处理速度不及对称加密。
3.在非对称加密中,究竟是公钥加密还是私钥加密的问题
1)如果只是用加密的用途
公钥加密,私钥解密(私钥只有一个,公钥大家都知道)。
2)如果用验签
私钥加密,公钥解密(解密的来源是私钥,其它的来源是不可信任的)。
下面是两个工具类。
写一个例子测试下。注意:先要运行上面main方法,使其生成security.key和security.crt。
1)明文变密文(你不知道密钥是很难解密的);
2)数据的一致性(hash值一样);
3)数据的可信任性(验签)。
2. 两种不同的加密与解密
1)对称加密:加密与解密使用相同的密钥,处理速度快;
2)非对称加密:加密与解密使用不同的密钥(生对生成),处理速度不及对称加密。
3.在非对称加密中,究竟是公钥加密还是私钥加密的问题
1)如果只是用加密的用途
公钥加密,私钥解密(私钥只有一个,公钥大家都知道)。
2)如果用验签
私钥加密,公钥解密(解密的来源是私钥,其它的来源是不可信任的)。
下面是两个工具类。
import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.Cipher; public class RSAHelper { public static final String KEY_ALGORITHM = "RSA"; private static final int KEY_LENGTH = 1024; public static final String PUBLIC_KEY = "PublicKey"; public static final String PRIVATE_KEY = "PrivateKey"; private static final int MAX_ENCRYPT_BLOCK = 117; private static final int MAX_DECRYPT_BLOCK = 128; private static final String SIGNATURE_ALGORITHM = "MD5withRSA"; public RSAHelper() { } public static void generateKeyPair(Map<String, Object> keyMap) { boolean result = false; KeyPairGenerator keyPairGenerator = null; try { keyPairGenerator = KeyPairGenerator.getInstance("RSA"); result = true; } catch (NoSuchAlgorithmException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } if (result) { SecureRandom secureRandom = new SecureRandom(); String currentDateTime = new SimpleDateFormat("yyyyMMddHHmmssSSS") .format(new Date()); secureRandom.setSeed(currentDateTime.getBytes()); keyPairGenerator.initialize(1024, secureRandom); KeyPair keyPair = keyPairGenerator.genKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); keyMap.put("PublicKey", publicKey.getEncoded()); keyMap.put("PrivateKey", privateKey.getEncoded()); } } public static void saveKeyPair(Map<String, Object> keyPair, String publicKeyFileName, String privateKeyFileName) { try { FileOutputStream fileOutputStream = new FileOutputStream( publicKeyFileName); byte[] publicKey = (byte[]) keyPair.get("PublicKey"); fileOutputStream.write(publicKey); fileOutputStream.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } try { FileOutputStream fileOutputStream = new FileOutputStream( privateKeyFileName); byte[] privateKey = (byte[]) keyPair.get("PrivateKey"); fileOutputStream.write(privateKey); fileOutputStream.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } } public static byte[] getKey(String keyFileName) { byte[] keyBytes = null; try { File file = new File(keyFileName); FileInputStream fileInputStream = new FileInputStream(file); DataInputStream dataInputStream = new DataInputStream( fileInputStream); keyBytes = new byte[(int) file.length()]; dataInputStream.readFully(keyBytes); dataInputStream.close(); fileInputStream.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } return keyBytes; } public static byte[] encryptWithPublicKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key publicK = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(1, publicK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 117) { cache = cipher.doFinal(data, offSet, 117); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 117; } byte[] encryptedData = out.toByteArray(); out.close(); return encryptedData; } public static byte[] encryptWithPrivateKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(1, privateK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 117) { cache = cipher.doFinal(data, offSet, 117); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 117; } byte[] encryptedData = out.toByteArray(); out.close(); return encryptedData; } public static byte[] decryptWithPublicKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key publicK = keyFactory.generatePublic(x509KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(2, publicK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 128) { cache = cipher.doFinal(data, offSet, 128); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 128; } byte[] decryptedData = out.toByteArray(); out.close(); return decryptedData; } public static byte[] decryptWithPrivateKey(byte[] data, int offSet, int length, byte[] keyBytes) throws Exception { PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(2, privateK); ByteArrayOutputStream out = new ByteArrayOutputStream(); int i = 0; while (length - offSet > 0) { byte[] cache; if (length - offSet > 128) { cache = cipher.doFinal(data, offSet, 128); } else { cache = cipher.doFinal(data, offSet, length - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 128; } byte[] decryptedData = out.toByteArray(); out.close(); return decryptedData; } public static byte[] sign(byte[] data, int offset, int length, byte[] privateKeyBytes) { byte[] signedData = null; try { PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec( privateKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory .generatePrivate(pkcs8EncodedKeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initSign(privateKey); signature.update(data, offset, length); signedData = signature.sign(); } catch (Exception ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } return signedData; } public static boolean verify(byte[] data, int offset, int length, byte[] publicKeyBytes, byte[] dataSignature) { boolean result = false; try { X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec( publicKeyBytes); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); Signature signature = Signature.getInstance("MD5withRSA"); signature.initVerify(publicKey); signature.update(data, offset, length); result = signature.verify(dataSignature); } catch (Exception ex) { Logger.getLogger(RSAHelper.class.getName()).log(Level.SEVERE, null, ex); } return result; } }
import com.adph.jms.Base64Utils; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; public class RSAKeyUtils { private static String RAS_PUBLICKEY_PATH = "D://security.key"; private static String RSA_PRIVATEKEY_PATH= "D://security.crt"; public RSAKeyUtils() { } protected static void init(String RAS_PUBLICKEY_PATH, String RSA_PRIVATEKEY_PATH) { try { FileUtils.forceMkdir(new File(new File(RAS_PUBLICKEY_PATH) .getParent())); Map<String, Object> keyPair = new HashMap(); RSAHelper.generateKeyPair(keyPair); RSAHelper.saveKeyPair(keyPair, RAS_PUBLICKEY_PATH, RSA_PRIVATEKEY_PATH); } catch (IOException e) { e.printStackTrace(); } } public static void setKeyPath(String keyPath) { RAS_PUBLICKEY_PATH = keyPath; } public static void setCrtPath(String crtPath) { RSA_PRIVATEKEY_PATH = crtPath; } public static String encByPublicKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.encryptWithPublicKey(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RAS_PUBLICKEY_PATH)); dataBack = Base64Utils.encode(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String encByPrivateKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.encryptWithPrivateKey(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RSA_PRIVATEKEY_PATH)); dataBack = Base64Utils.encode(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String decByPublicKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.decryptWithPublicKey( Base64Utils.decode(data), 0, Base64Utils.decode(data).length, RSAHelper.getKey(RAS_PUBLICKEY_PATH)); dataBack = new String(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String decByPrivateKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.decryptWithPrivateKey( Base64Utils.decode(data), 0, Base64Utils.decode(data).length, RSAHelper.getKey(RSA_PRIVATEKEY_PATH)); dataBack = new String(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static String doSignPrivateKey(String data) { String dataBack = ""; try { if (!StringUtils.isEmpty(data)) { byte[] Bytes = RSAHelper.sign(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RSA_PRIVATEKEY_PATH)); dataBack = Base64Utils.encode(Bytes); } } catch (Exception e) { e.printStackTrace(); } return dataBack; } public static boolean doVerifyPublicKey(String data, String sign) { Boolean returnFlag = Boolean.FALSE; if ((StringUtils.isEmpty(data)) || (StringUtils.isEmpty(sign))) { return Boolean.FALSE.booleanValue(); } try { returnFlag = Boolean.valueOf(RSAHelper.verify(data.getBytes(), 0, data.getBytes().length, RSAHelper.getKey(RAS_PUBLICKEY_PATH), Base64Utils.decode(sign))); } catch (Exception e) { e.printStackTrace(); } return returnFlag.booleanValue(); } // public static void main(String[] args) { // init("D://security.key", "D://security.crt"); // } }
写一个例子测试下。注意:先要运行上面main方法,使其生成security.key和security.crt。
public class EncTest { public static void main(String[] args) throws Exception { String text = "Hello World"; String enc = RSAKeyUtils.encByPublicKey(text); System.out.println("加密数据:" + enc); System.out.println("解密数据:" + RSAKeyUtils.decByPrivateKey(enc)); String sign=RSAKeyUtils.doSignPrivateKey(text); System.out.println("签名:"+sign); System.out.println("验签结果:"+RSAKeyUtils.doVerifyPublicKey(text, sign)); } }
发表评论
-
Java IO 读文件的各种方法总结
2016-01-01 15:00 665IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 691代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 396对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2293我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 818今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 7761. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 692xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 3981. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 327Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 359JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 360在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 678Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1934背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
C3P0 连接分析
2015-12-01 19:05 850最近在看C3P0的原理,还是将C3P0的源码导入到Ecplis ... -
微信开发的原理
2015-11-30 10:10 1275微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 15951. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
java try catch finally return 继续
2015-11-27 13:45 361之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1546对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
Java WeakHashMap 分析
2015-11-26 08:17 579昨天在我们的系统中看 ... -
加密与解密
2015-11-18 18:12 439我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
C#与java平台RSA加密解密签名验签互通案例,解决RSA在C#与java加密算法不同导致验签不过情况
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对字节数组的加密解密,签名验签,支持多种形式的的,可以将待操作的对象转换成字节...
Delphi RSA加密,解密,签名.密钥对生成工具.与C,Java,php等互通加解密
根据证书私钥加签---》RSA公钥加密--》RSA私钥解密---》证书公钥验签
一个简单的java使用RSA生成公私钥对 非对称加密解密 签名验签的过程,附带一个基本的加密工具类,有兴趣的朋友可以下载下来看看
Java与.NET RSA加密解密(签名,验签)实例代码。与支付宝pos对接的过程中用到了(只用了RSA.cs)。
Java 实现RSA 签名/验签与加密解密
示例代码中实现了在.net端进行签名,java端进行验证,以及java端加密,.net端解密的完整过程
使用.net2.0 的 MD5加密/SM3加密/RSA加密/RSA签名, 用 java解密或签名验签代码
工具包可以从某个路径下读取密钥并进行加密解密签名验签。密钥以UTF-8编码的字符串格式存储。密文经过sun 内部的Base64Encoder编码成为字符串后返回密文字符串。解密的时候先使用Base64Decoder先解码密文,然后再...
RSA加密工具类,公私钥加解密、公私钥验签,读取私钥.ps8方法。
spring框架中关于RSA sha-256加密解密,加签验签工具类
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973
C# RSA读取密钥文件pfx cer 签名验签加密解密帮助类以及RSA公钥私钥与java互转
支持DES,Base64,MD5,RSA加密解密,DSA签名和签名验证
使用RSA生成公私钥对、加解密、及签名验签 JAVA源码,可供学习设计参考。
SHA256withRSA java常用的json加签验签工具类 SHA256withRSA 完美工具类 RSAUtils,包含: 1、签名 2、验签 3、公钥加密》私钥解密 4、私钥加密》公钥解密
php rsa 加密,解密,签名,验签 由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用。 以下php版本是适用于对接java接口,java适用密钥再...
c# RSA读取密钥文件pfx cer 签名验签加密解密工具类 1 包含java形式密钥转换成c# c# 形式密钥转换成java