- 浏览: 52901 次
文章分类
最新评论
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 697IO分为字节流和字符流,字符就是简单的字符串存储,从理伦上讲, ... -
动态代理的应用
2015-12-22 17:30 732代理模式作为开发人员 ... -
Java Restful
2015-12-19 14:01 440对于两个系统之间交互信息,有两种常见的方式:webservic ... -
request.getInputStream() 只能读一次的解决方法
2015-12-17 12:17 2377我们知道request.getInputStream()只能读 ... -
java Hessian 版本冲突问题解决方法
2015-12-11 19:44 865今天在实际的项目发现了一个问题就是hessian的版本不兼容的 ... -
ThreadPoolExecutor参数讲解
2015-12-10 08:14 8161. 线程池可以节省创建多个线程带来的开销问题。 2. 线程 ... -
Java Xstream xml 与bean之间的转换
2015-12-09 08:31 745xml文件如下: <mvc> & ... -
XPATH 解析XML
2015-12-09 08:28 4341. 表达式描述 nodename 选取此节点的所有子节 ... -
Java Dom4j 解析XML
2015-12-09 08:23 365Dom4j和JDom是很相似的,用起来十分方便。 XML文件 ... -
Java JDom 解析xml
2015-12-09 08:22 415JDOM在解析XML在代码量之上比之前的方法(DOM和SAX要 ... -
Java SAX 解析xml
2015-12-08 18:13 419在上一篇中http://gaofulai1988.iteye. ... -
Java XML解析系列
2015-12-08 18:00 752Java解析XML有多种方式,因此需要分为几个不同的系列来讲。 ... -
Java 背包算法计算从数组中找若干个数使其最接近某个数
2015-12-08 17:38 1988背包的算法的动态方式如下: f(i,w) = max{ f(i ... -
C3P0 连接分析
2015-12-01 19:05 891最近在看C3P0的原理,还是将C3P0的源码导入到Ecplis ... -
微信开发的原理
2015-11-30 10:10 1318微信在现在的生活中,扮演着举足轻重的角色,现在怎么东西都在微信 ... -
JAVA Timestamp 与Data的转化以及BigDecimal 保留两位小数
2015-11-27 14:47 16991. BigDecimal 保留两位小数 今天在项目中遇到这 ... -
java try catch finally return 继续
2015-11-27 13:45 402之前在博客中有一篇文章讨论过异常中return值的情况,有兴趣 ... -
Java JDBC executeBatch 批量操作
2015-11-27 08:05 1628对JDBC 的 CRUD操作,我相信对于每个开发人员来讲,是十 ... -
Java WeakHashMap 分析
2015-11-26 08:17 620昨天在我们的系统中看 ... -
加密与解密
2015-11-18 18:12 480我本身不是学密码出身的,但在工作中经常要使用加密与解密的东东, ...
相关推荐
本案例聚焦于"C#与Java平台RSA加密解密签名验签互通"的问题,这涉及到两个主要的技术点:RSA加密算法和跨平台兼容性。下面将详细阐述这两个知识点。 首先,RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和...
在Android开发中,数据安全是至关重要的,尤其是在...通过以上步骤,您可以在Android应用中实现RSA加密解密和签名验签功能,确保数据的安全传输和验证。记住,安全无小事,合理的加密策略是保障应用安全的重要一环。
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
支持任何形式的aes加密,文件,字符,字节等,内含php代码,可以与php平台实现aes加密,而且包含rsa非对称加密签名验签实现,都是对字节数组的加密解密,签名验签,支持多种形式的的,可以将待操作的对象转换成字节...
总的来说,该博客文章通过`RSAEncrypto.java`和`RSADecrypto.java`文件提供了使用Java进行RSA加密解密和签名验证的示例代码,涵盖了Sun JCE库和Bouncy Castle库的使用,这对于理解RSA加密机制和实践Java安全编程非常...
本文将详细讲解RSA算法的加签、加密、解密以及验签的过程,结合Java语言来实现这一系列操作,并涉及到证书的使用。 首先,我们需要理解RSA算法的基本原理。RSA算法基于两个大素数的乘积难以分解这一数学难题,生成...
本实例代码着重于Java与.NET平台之间的RSA加密解密及签名验签操作,这对于跨平台的数据安全通信具有实际意义,例如与支付宝POS对接时。 1. **RSA算法基础**: RSA是一种基于大数因子分解困难性的公钥密码体制。它...
6. 压缩包中的`signature`文件可能包含的是一个示例程序,演示了如何在Java中使用RSA进行签名、验签、加密和解密。这个程序可能会包括以下关键部分: - 导入必要的安全库 - 创建并初始化`KeyPairGenerator` - ...
RSA是一种非对称加密算法,由Ron ...通过以上介绍,我们可以看出Delphi中的RSA加密、解密和签名实现并不复杂,但涉及到的关键技术与理论基础深厚。开发者在实际应用中应确保遵循最佳实践,以保证系统的安全性和可靠性。
这些代码演示了.NET与Java间如何正确地进行RSA签名验证和加密解密。确保在实际应用中,安全地处理和存储密钥,遵循最佳实践,以防止密钥泄露导致的安全风险。 通过理解这些基本步骤,开发者可以在.NET和Java之间...
本文将深入探讨.NET 2.0框架下实现的MD5、SM3、RSA加密以及RSA签名,以及如何在Java环境中对这些操作进行解密和验签。 首先,MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它可以将任意长度的数据...
Java实现RSA加密解密签名校验是信息安全领域中常见的任务,尤其在数据传输和网络通信中,RSA算法因其非对称性的特点,被广泛应用于数据的加密、解密以及数字签名。下面将详细介绍RSA算法的基本原理,以及如何使用...
在IT行业中,尤其是在网络安全和数据保护领域,非对称加密...总之,RSA在Java中的应用是网络安全和隐私保护的重要手段,通过理解并熟练运用其生成公私钥、加密解密和签名验签等操作,我们可以构建更加安全的应用系统。
在这个"RSA加密、解密、签名、验签小工具"中,我们可以看到几个关键功能: 1. **加密**:RSA加密是将明文信息使用接收者的公钥进行加密,这样只有拥有对应私钥的人才能解密,确保了信息在传输过程中的安全。加密...
工具包可以从某个路径下读取密钥并进行加密解密签名验签。密钥以UTF-8编码的字符串格式存储。密文经过sun 内部的Base64Encoder编码成为字符串后返回密文字符串。解密的时候先使用Base64Decoder先解码密文,然后再...
总结一下,C#中处理RSA密钥文件,如pfx和cer,以及进行签名、验签、加密和解密,主要依赖于`System.Security.Cryptography`命名空间。此外,为了实现C#和Java之间的公钥私钥互转,我们需要理解不同的密钥表示形式并...
**PGP 加解密及签名验签示例** PGP(Pretty Good Privacy)是一种广泛使用的加密软件,主要用于电子邮件、文件的加密以及数字签名。它基于公开密钥加密算法,如RSA和IDEA,确保数据在传输过程中的安全性和完整性。...
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973
RSA加密工具类,公私钥加解密、公私钥验签,读取私钥.ps8方法。
总之,这个"java 数字签名验签"项目为开发人员提供了一套完整的数字签名解决方案,能够有效地保障数据的安全传输和接收者的信任。通过二次开发,可以轻松地将签名和验签功能整合到各种应用中,提升系统的安全性和...