RSA加密算法java编程实现

合集下载

RSA算法 JS加密 JAVA解密

RSA算法 JS加密 JAVA解密

RSA算法JS加密JA V A解密有这样一个需求,前端登录的用户名密码,密码必需加密,但不可使用MD5,因为后台要检测密码的复杂度,那么在保证安全的前提下将密码传到后台呢,答案就是使用RSA非对称加密算法解决。

java代码需要依赖commons-codec 包RSACoder.Javaimport mons.codec.binary.Base64;import javax.crypto.Cipher;import java.security.*;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;/*** Created by lake on 17-4-12.*/public class RSACoder {public static final String KEY_ALGORITHM = "RSA";public static final String SIGNA TURE_ALGORITHM = "MD5withRSA";private static final String PUBLIC_KEY = "RSAPublicKey";private static final String PRIV ATE_KEY = "RSAPrivateKey";public static byte[] decryptBASE64(String key) {return Base64.decodeBase64(key);}public static String encryptBASE64(byte[] bytes) {return Base64.encodeBase64String(bytes);}/*** 用私钥对信息生成数字签名** @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));}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[] decryptByPrivateKey(String data, String key)throws tion {return decryptByPrivateKey(decryptBASE64(data),key);}/*** 解密<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(String 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.getBytes());}/*** 加密<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, Key> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIV ATE_KEY);return encryptBASE64(key.getEncoded());}/*** 取得公钥** @param keyMap* @return* @throws Exception*/public static String getPublicKey(Map<String, Key> keyMap)throws ption {Key key = keyMap.get(PUBLIC_KEY);return encryptBASE64(key.getEncoded());}/*** 初始化密钥** @return* @throws Exception*/public static Map<String, Key> initKey() throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair();Map<String, Key> keyMap = new HashMap(2);keyMap.put(PUBLIC_KEY, keyPair.getPublic());// 公钥keyMap.put(PRIV ATE_KEY, keyPair.getPrivate());// 私钥return keyMap;}}测试类RSACoderTest.javaimport org.junit.Before;import org.junit.Test;import java.security.Key;import java.util.Map;import static org.junit.Assert.assertEquals;import static org.junit.Assert.assertTrue;/*** Created by lake on 17-4-12.*/public class RSACoderTest {private String publicKey;private String privateKey;@Beforepublic void setUp() throws Exception {Map<String, Key> keyMap = RSACoder.initKey();publicKey = RSACoder.getPublicKey(keyMap);privateKey = RSACoder.getPrivateKey(keyMap);System.err.println("公钥: \n\r" + publicKey);System.err.println("私钥:\n\r" + privateKey);}@Testpublic void test() throws Exception {System.err.println("公钥加密——私钥解密");String inputStr = "abc";byte[] encodedData = RSACoder.encryptByPublicKey(inputStr, publicKey);byte[] decodedData = RSACoder.decryptByPrivateKey(encodedData,teKey);String outputStr = new String(decodedData);System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);assertEquals(inputStr, outputStr);}@Testpublic void testSign() throws Exception {System.err.println("私钥加密——公钥解密");String inputStr = "sign";byte[] data = inputStr.getBytes();byte[] encodedData = RSACoder.encryptByPrivateKey(data, privateKey);byte[] decodedData = RSACoder.decryptByPublicKey(encodedData, publicKey);String outputStr = new String(decodedData);System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);assertEquals(inputStr, outputStr);System.err.println("私钥签名——公钥验证签名");// 产生签名String sign = RSACoder.sign(encodedData, privateKey);System.err.println("签名:" + sign);// 验证签名boolean status = RSACoder.verify(encodedData, publicKey, sign);System.err.println("状态:" + status);assertTrue(status);}}前端代码依赖jsencrypt 项目<script src="bin/jsencrypt.min.js"></script><script type="xt/javascript">var encrypt = new JSEncrypt();encrypt.setPublicKey('java生成的公钥');var encrypted = encrypt.encrypt('加密的字符串');</script>说明前端生成加密的字符串encrypted,传到后台,java使用私钥进行解密即可。

C#与JavaRsa加密与解密互通

C#与JavaRsa加密与解密互通

C#与JavaRsa加密与解密互通Rsa 加密标准的制定已经过去了⼗多年了. 这两天在看rsa 加密的⽂章,基本上都是在说 .net 与 java 之间的 rsa加密是不能互通的.因为项⽬有⽤到,所以花了点时间对rsa加密做了⼀点点了解,发现,不管是java 还是 C# 都对 rsa 的标准加密进⾏了实现, 是对于标准是实现,不能互通就讲不过去了. 今天特意写了⼀段java 代码试了⼀下,发现是完全可以的.密钥的描述: C#(.net) 中有三种⽅式导出密钥,⼀种是blob,⼀种是 xml 另⼀种是参数,其中xml 的⽅式是把参数进⾏了 xml序列化.blob 的形式我没看懂是什么意思,只知道⽂档上说是给微软的什么api⽤的,下⾯给出其参数的形式.RSAParameters 字段Contains对应的 PKCS #1 字段d,私钥指数privateExponentd mod (p - 1) exponent1d mod (q - 1) exponent2e,公钥指数publicExponent(InverseQ)(q) = 1 mod p coefficientn modulusp prime1q prime2RSA 算法若要⽣成密钥对,可以从创建名为 p 和 q 的两个⼤的质数开始; 这两个数相乘,结果称为 n; 因为 p 和 q 都是质数,所以 n 的全部因数为 1、p、q 和 n;如果仅考虑⼩于 n 的数,则与 n 为互质数(即与 n 没有公因数)的数的个数等于 (p - 1)(q - 1);现在,选择⼀个数 e,它与计算的值为互质数; 则公钥表⽰为 {e, n};若要创建私钥,则必须计算 d,它是满⾜ (d)(e) mod n = 1 的⼀个数; 根据 Euclidean 算法,私钥为 {d, n};纯⽂本 m 到密码⽂本 c 的加密定义为 c = (m ^ e) mod n; 解密则定义为 m = (c ^ d) mod n;总之,我们可以从 .net 的rsa 中拿到合适的密钥描述就是了,⾄于 java的,我想也是可以做到的,⽽且通常密钥是应该放在密钥容器的.接下来我们⽤.net ⽣成⼀个 rsa 的密钥,以⼗六进制的⽅式输出的(new ⼀个RSACryptoServiceProvider,把密钥导出就可以了)D: 2FE7479CF4CFEE63218C44D763C3E552DC5FBC94A31F944B88AE8E58F0ED16874B8BED35307B143F413761B2ECFFC95F48DF0D0A29FC155C0B968EFE9FFF36E7DP: 6777B761BC29637622FC63682243BB2E05CCFC6FF710ADE1DCE6B0C843B17C4FDQ: 68771CCDA40F0DA0B504C438BB03F7DF30F77364094D475E70270D148260D247Exponent: 010001InverseQ: 5665AB47697008CC2CECB544B582B9C50628281C400846C1E736629B03FE5C85Modulus: B3F276C8EDF515FD3248CCF4163480B9F77443A666522D66B89411EC6DFE11DEA917A97C977750EE777DACBD4D2C11BC363FDC110E5CCA0A1361D51AFA4A7ADDP: ECC60A01B1BDCBA1C5422D8A0A34FC0E46727DB4ED5089E54C356F052E0AB573Q: C28F233948483D0CD0E3FA7B5D2955F2B15E831B38876FB0E7180D873EDF7A6F为了⽅便写.net 代码,这⾥贴⼀下blob的密钥0702000000A40000525341320002000001000100DD7A4AFA1AD561130ACA5C0E11DC3F36BC112C4DBDAC7D77EE5077977CA917A9DE11FE6DEC1194B8662D5266A64374F7B9803416F4CC4832FD15F5EDC876F2B373B50A2E056F354CE58因为是私钥,所以同时可以加密和解密.下⾯上 C# 代码,⽐较简单using System;using System.Security.Cryptography;class Program{public static void Main(string[] args){byte[] plainText = new byte[]{0,1,2,3,4,5};byte[] cipherText;byte[] key = String2Bytes("0702000000A40000525341328001000001000100D3D10816051881319774576B67B1D24F3AA303471A4402AB625208EC1CB04D508AF2098227C5EE185890ECB83E6971C12BDCF4F8AB0FD729167C815D34 using(var rsa = new RSACryptoServiceProvider()){rsa.ImportCspBlob(key);Console.WriteLine("OAEP:");Console.WriteLine(Bytes2String(rsa.Encrypt(plainText, true)));Console.WriteLine("PCSK1-v1_5:");Console.WriteLine(Bytes2String(rsa.Encrypt(plainText, false)));}Console.Write("Press any key to continue . . . ");Console.ReadKey(true);}const string pattern = @"[^0-9a-fA-F]+";static byte[] String2Bytes(string str){str = System.Text.RegularExpressions.Regex.Replace(str, pattern, "");if (str == string.Empty)return null;byte[] data = new byte[str.Length / 2];for (int i = 0; i < data.Length; ++i)data[i] = byte.Parse(str.Substring(2 * i, 2), System.Globalization.NumberStyles.HexNumber);return data;}static string Bytes2String(byte[] data){System.Text.StringBuilder builder = new System.Text.StringBuilder();foreach (var element in data) {builder.AppendFormat("{0:X2}",element);}return builder.ToString();}}运⾏后输出(rsa加密,密⽂每次都不⼀定⼀样):OAEP:87F04B0F28B81D23E63DA71C8278E0B7E357F40583BDDCAB493D44A58080EB178EC8E0DB0DCD4BE5427FDB8190229B8DF2511BDA1082607C92BD03B0615D5AD3 PCSK1-v1_5:358AB4D336D0C35DAE3895E8A125F4F5AD0FB58117A4100FAF15DE95FF8615F01FFB1A59C9B579792B7C14E93E54A3E7E236D464DDB93D8DF9D96F63F46BACD7现在我们有密⽂了,⾄于.net 的解密 .net 加密后的密⽂,我没兴趣去看,反正铁定可以的就是了.下⾯我们写java 的解密部分package rsatest;import java.math.BigInteger;import java.security.KeyFactory;import java.security.PrivateKey;import java.security.PublicKey;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.RSAPublicKeySpec;import javax.crypto.Cipher;public class RsaTest {public static void main(String[] args) throws Exception {//前⾯补了个0,符号位为0,表⽰⾮负BigInteger n = new BigInteger("B3F276C8EDF515FD3248CCF4163480B9F77443A666522D66B89411EC6DFE11DEA917A97C977750EE777DACBD4D2C11BC363FDC110E5CCA0A1361D51AFA4A7ADD", 16); BigInteger e = new BigInteger("010001", 16);BigInteger d = new BigInteger("2FE7479CF4CFEE63218C44D763C3E552DC5FBC94A31F944B88AE8E58F0ED16874B8BED35307B143F413761B2ECFFC95F48DF0D0A29FC155C0B968EFE9FFF36E7", 16);RSAPublicKeySpec keySpec = new RSAPublicKeySpec(n, e);PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);RSAPrivateKeySpec prvKeySpec = new RSAPrivateKeySpec(n, d);PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(prvKeySpec);//现在key 准备好了,把前⾯的密⽂放这⾥解密byte[] oaepCiphertext = Hex2Bytes("87F04B0F28B81D23E63DA71C8278E0B7E357F40583BDDCAB493D44A58080EB178EC8E0DB0DCD4BE5427FDB8190229B8DF2511BDA1082607C92BD03B0615D5AD3");//解密OAEP 加密的数据Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPADDING");cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] plaintext = cipher.doFinal(oaepCiphertext);System.out.println(Bytes2Hex(plaintext));//解密PKCS1-v1_5 加密的数据byte[] ciphertext = Hex2Bytes("358AB4D336D0C35DAE3895E8A125F4F5AD0FB58117A4100FAF15DE95FF8615F01FFB1A59C9B579792B7C14E93E54A3E7E236D464DDB93D8DF9D96F63F46BACD7");cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, privateKey);plaintext = cipher.doFinal(ciphertext);System.out.println(Bytes2Hex(plaintext));}public static byte[] Hex2Bytes(String hexStr) {if (hexStr.length() % 2 != 0) {hexStr = "0" + hexStr;}byte[] bytes = new byte[hexStr.length() / 2];for (int i = 0; i < bytes.length; ++i) {bytes[i] = (byte) Integer.parseUnsignedInt(hexStr.substring(i * 2, i * 2 + 2), 16);}return bytes;}public static String Bytes2Hex(byte[] bytes) {StringBuilder builder = new StringBuilder();for (byte b : bytes) {builder.append(String.format("%02X", b));}return builder.toString();}}程序运⾏后输出:000102030405000102030405跟我们预期的是⼀样的.我们再⽤java 对明⽂加密,代码⽚段// plaintext {0,1,2,3,4,5}cipher = Cipher.getInstance("RSA/ECB/OAEPPADDING");cipher.init(Cipher.ENCRYPT_MODE, publicKey);oaepCiphertext = cipher.doFinal(plaintext);System.out.println("OAEP:");System.out.println(Bytes2Hex(oaepCiphertext));cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);ciphertext = cipher.doFinal(plaintext);System.out.println("PCSK1-v1_5:");System.out.println(Bytes2Hex(ciphertext));对应输出(rsa加密,密⽂每次都不⼀定⼀样):OAEP:3144C4CB06C7F49D31E65D09C840069F7CCF602487908CCEAB33D473B949199E1795530B69E1FA20EB59E392B2B934024D46E979DEA1682BDFA61D6FDD980F9C PCSK1-v1_5:699A694BEB75616879C6B8D311CC10D987EA109D494EE6C9380CD2C02A124613F130C440CB1CA6D3405E50B62CF96A79EB43C3370253E5D8C1A9132CFE01D686接下来⽤C# 对数据解密,代码⽚段//还是⽤之前那个rsa对象//OAEPcipherText = String2Bytes("3144C4CB06C7F49D31E65D09C840069F7CCF602487908CCEAB33D473B949199E1795530B69E1FA20EB59E392B2B934024D46E979DEA1682BDFA61D6FDD980F9C"); Console.WriteLine(Bytes2String(rsa.Decrypt(cipherText, true)));//PCSK1-v1_5cipherText = String2Bytes("699A694BEB75616879C6B8D311CC10D987EA109D494EE6C9380CD2C02A124613F130C440CB1CA6D3405E50B62CF96A79EB43C3370253E5D8C1A9132CFE01D686"); Console.WriteLine(Bytes2String(rsa.Decrypt(cipherText, false)));对应的输出:000102030405000102030405解密也成功了.或许该头疼的问题是,已知 {e,n} 或者 {d,n} 怎么⽣成.net 使⽤的密钥.。

使用Java实现安全性加密与解密

使用Java实现安全性加密与解密

使用Java实现安全性加密与解密在当今信息时代,数据的安全性越来越受到重视。

无论是个人的隐私信息还是企业的商业机密,都需要得到有效的保护。

而加密与解密技术就是一种常用的保护数据安全的手段。

本文将介绍如何使用Java语言实现安全性加密与解密。

1. 加密与解密的基本概念加密是将明文转换为密文的过程,而解密则是将密文转换回明文的过程。

加密算法通常使用一个密钥,密钥用于控制加密过程的转换规则,只有拥有正确的密钥才能进行解密。

常见的加密算法有对称加密算法和非对称加密算法。

对称加密算法使用相同的密钥进行加密和解密,速度较快,但密钥的传输和管理相对困难。

非对称加密算法使用一对密钥,公钥用于加密,私钥用于解密,安全性较高,但速度较慢。

2. 使用Java实现对称加密Java提供了多种对称加密算法的实现,如DES、AES等。

下面以AES算法为例,介绍如何使用Java实现对称加密。

首先,需要导入Java加密扩展(JCE)的包。

在Java 8及以上版本中,JCE已经被默认包含在JDK中,无需额外导入。

接下来,可以使用以下代码进行AES加密:```javaimport javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESUtil {private static final String ALGORITHM = "AES";public static String encrypt(String plainText, String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String encryptedText, String key) throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);keyGenerator.init(128);SecretKey secretKey = keyGenerator.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec secretKeySpec = new SecretKeySpec(enCodeFormat, ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(encryptedBytes);return new String(decryptedBytes);}}```以上代码中,`encrypt`方法用于对明文进行加密,`decrypt`方法用于对密文进行解密。

RSA算法签名技术Java与C++统一(加密解密结果一样)

RSA算法签名技术Java与C++统一(加密解密结果一样)

RSA算法签名技术Java与C++统一(加密解密结果一样)源代码下载地址:/product_down/rsa_c++_java.rar一、介绍:RSA 算法的介绍:公钥加密、私钥解密或私钥加密、公钥解密,这样们可以在终端软件公开我们的公钥而不会影响安全性。

RSA这种特点常用在电信、等行业数字签名中。

SHA-1 算法的介绍:从一段字符串中计算出唯一标识这段字符串的信息摘要(160bit位=20位字符)和md5算法类似。

RSA、SHA-1算法在网上都有很详细的介绍不是本文介绍重点,本文重点介绍RSA算法在完成加密解密及数字签名过程中用不同开发语言对接的问题(java与c++)对于其它开发语言例如vb、delphi、pb等可以调用c++的lib、dll库文件来完成。

二、数字签名流程1、A构建密钥对,将公钥公布给B1...B2,将私钥保留。

2、A使用私钥加密数据,然后对加密后的数据签名(签名算法:密文=rsa(明文,privatekey),Sgn=sha-1(密文) ,发送给B1..B2;B1..B2使用Sign来验证待解密数据是否有效,如果有效使用公钥对数据解密rsa(密文,publickey)、。

3、B1..B2使用公钥加密数据rsa(明文,publickey),向A发送经过加密后的数据;A 获得加密数据,通过私钥解密rsa密文,privatekey)。

4、数字只起到数据在网络传送中验证否被篡改过并保证加密数据的完整性。

而RSA数据的安全是由RSA算法来完成的。

(工作流程图如下:)三、Java与C++等开发语言RSA算法统一性分析要完成上面的数字签名技术关键是对RSA算法在不同开发语言中标准一致,从而达到RSA能正确加密、解密。

1.JA V A是开源可破解的并且RSA算法封装的很好所以在网站找到用java实现RSA数字例子很容易。

这里们提供你个很典型的JA V A实现RSA加密及数字签名例子。

2.下载地址:/product_down/rsa_c++_java.rar3.JA V A生产密钥对(伪代码):private String publicKey;private String privateKey;Map<String, Object> keyMap = RSACoder.initKey();publicKey = RSACoder.getPublicKey(keyMap);privateKey = RSACoder.getPrivateKey(keyMap);System.err.println("公钥: \n\r" + publicKey);System.err.println("私钥:\n\r" + privateKey);那么我们发现JA V A采用的公钥、私钥与标准的算法说的公钥=E+M、私钥=D+M 不同那么我们如何通过JA V A的publickey、privatekey获得E、D、M呢?4.分解java公钥、私钥:BigInteger e = publicKey.getPublicExponent();BigInteger n =publicKey.getModulus();BigInteger d = privateKey.getPrivateExponent();BigInteger m = privateKey.getModulus();System.out.println("==============C++程序密钥==================");System.out.println("因子E:"+e.toString()+"\r\n");System.out.println("因子D:"+d.toString()+"\r\n");System.out.println("因子N:"+n.toString()+"\r\n");System.out.println("因子M:"+m.toString()+"\r\n");这样我们就获得啦E、D、M 从而达到啦JA V A密钥与C++等开发语言密钥的一致性。

Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密

Java使⽤Cipher类实现加密,包括DES,DES3,AES和RSA加密⼀、先看⼀个简单加密,解密实现1.1 加密/*** content: 加密内容* slatKey: 加密的盐,16位字符串* vectorKey: 加密的向量,16位字符串*/public String encrypt(String content, String slatKey, String vectorKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] encrypted = cipher.doFinal(content.getBytes());return Base64.encodeBase64String(encrypted);}1.2 解密/*** content: 解密内容(base64编码格式)* slatKey: 加密时使⽤的盐,16位字符串* vectorKey: 加密时使⽤的向量,16位字符串*/public String decrypt(String base64Content, String slatKey, String vectorKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] content = Base64.decodeBase64(base64Content);byte[] encrypted = cipher.doFinal(content);return new String(encrypted);}1.3 代码解释上⾯简单实现了AES("AES/CBC/PKCS5Padding")的加密和解密。

如何利用java程序实现加密所需的公钥、密钥、数字证书

如何利用java程序实现加密所需的公钥、密钥、数字证书

如何利⽤java程序实现加密所需的公钥、密钥、数字证书本篇的主要⽬的在于实现pdf的数字签名问题,只是作为我学习知识的总结。

1、数字签名算法的概述数字签名:私钥⽤于签名,公钥⽤于验证。

数字签名的作⽤:验证数据的完整性,认证数据来源,抗否认。

数字签名实现的具体原理:1、将报⽂按双⽅约定的HASH算法计算得到⼀个固定位数的报⽂摘要。

在数学上保证,只要改动报⽂中任何⼀位,重新计算出的报⽂摘要值就会与原先的值不相符。

这样就保证了报⽂的不可更改性。

(详见参考资料的"公钥密码技术原理"章节)2、将该报⽂摘要值⽤发送者的私⼈密钥加密,然后连同原报⽂和数字证书(包含公钥)⼀起发送给接收者⽽产⽣的报⽂即称数字签名。

3、接收⽅收到数字签名后,⽤同样的HASH算法对报⽂计算摘要值,然后与⽤发送者的公开密钥进⾏解密解开的报⽂摘要值相⽐较,如相等则说明报⽂确实来⾃所称的发送者。

4、同时通过证书颁发机构CA确认证书的有效性即可确认发送的真实⾝份。

常⽤的数字签名有:RSA、DSA、ECDSA2、RSA算法概述RSA是⽬前为⽌应⽤最为⼴泛的⾮对称加密算法。

⾮对称加密算法简单的说就是分成公钥和私钥。

加密和解密采⽤不同的算法实现,这样的好处是不需要像传统对称加密算法⼀样将相同算法的密钥分发给对⽅,从⽽减少密钥被获取所带来的严重危害,⽬前基本上都是采⽤⾮对称算法,⽽RSA是最为⼴泛的。

理论上1024位以上的RSA是⽆法破解的(或者未公开)。

基本原理:⾮对称算法将密码将密码分为公钥和私钥,公钥发送给⽤户(可以是多个),⽤户⽤公钥加密想要发送的数据,然后发送给服务器,服务器通过私钥解密加密后的数据。

基本步骤:⽣成公钥和私钥步骤:1. 随机选择两个不相等的质数p和q2. 计算p和q的乘积n (n的长度就是密钥长度。

3233写成⼆进制是110010100001,⼀共有12位,所以这个密钥就是12位。

实际应⽤中,RSA密钥⼀般是1024位,重要场合则为2048位。

JAVARSA私钥加密(签名)对应C#RSA私钥加密(签名)

JAVARSA私钥加密(签名)对应C#RSA私钥加密(签名)

JAVARSA私钥加密(签名)对应C#RSA私钥加密(签名)⾮对称密钥RSA算法加解密在C#和Java之间交互的问题,这两天看了很多其他⼈写的⽂章,碰到了⼏个问题,最终解决问题。

需求⽬的:完成c#请求端RSA加密(签名)问题,客户端采⽤C#开发,服务器端采⽤Java开发。

服务器端给客户端提供私钥,进⾏数据加密(签名),客户端加密(签名)后提数据提交给服务器,服务器⽤公钥对数据解密,进⾏验证。

解决过程碰到的问题:1.JAVA 需要的 RSA私钥格式和 C# 需要的 RSA私钥不⼀致。

JAVA 需要是 PKCS8格式私钥:-----BEGIN PRIVATE KEY-----MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOwuOHH/OIRE+0ifmEPYGuhYRTyKdd6VLFIsNqy/SO5xZitHfA7xEymJKnpEUGgDJKr5zbFbytnWs5Jjgen6TXkUh9LG/fhPGGHdUVB42pAHv5yzoyEaOnJxBAxd6UstoWTaEgbT6GUbzMr/Az25zuxw7c+skAlnUETVE5GL3tD7AgMBAAECgYEAxdNZODMctb3J9OSo93rV3vPA2prna87rVtDt4vg+MGsPtwSjZyiKcmoQCGWcK+MmHYgrwHkwihKKSv3KXZ9or3xQ2wNZGuTHLymWEzqfEfVb0igvxbe85EGwsaN3qSK62CK8vok/Bi+fZVa3UNCn0WFslUS0qn+K3SECM9I1iwECQQD+2Pl2AJGQs2bRXSsnJk0FIwjpqdpGZFPlAUYaXkuTMqpwefP/bwwiuWqq9QIt2vAAKgy5T16tpPBcGpT6cvxBAkEA7T+i1gVwrXcozTuT9oCwkF2MGBaXkv3mN9H/Pfy/oIhTsgiDxX8t+0KapAEQogvCuAOq19JvGw5e91H2g0suOwJAJOMnCIuAhl9RTJCdxGbo0wuFKL0rGPFAq28JxJtNeRrmTK16QcjDCuunouMf059TCdMMUG5Kl/u9xrcaRT4LgQJAZPiUYOnnzqvMHayhiGO0wXxOx2G2GMUeWdtx+fu7wqLCnB6rlj5OX4U1M1+QqKbAtHg7Gadhye4P1Mp5U9+HSQJBANLVzcCXyAX2D12UPTPkhcNRaCRXFp3aJGMxI4iluUC+ukAdiapohqZ7vMQyWRq/tDyiwjirqMcg/AJIuQWmPyc=-----END PRIVATE KEY-----C# 需要的是 PKCS1 格式私钥:-----BEGIN RSA PRIVATE KEY-----MIICXQIBAAKBgQDsLjhx/ziERPtIn5hD2BroWEU8inXelSxSLDasv0jucWYrR3wO8RMpiSp6RFBoAySq+c2xW8rZ1rOSY4Hp+k15FIfSxv34Txhh3VFQeNqQB7+cs6MhGjpycQQMXelLLaFk2hIG0+hlG8zK/wM9uc7scO3PrJAJZ1BE1RORi97Q+wIDAQABAoGBAMXTWTgzHLW9yfTkqPd61d7zwNqa52vO61bQ7eL4PjBrD7cEo2coinJqEAhlnCvjJh2IK8B5MIoSikr9yl2faK98UNsDWRrkxy8plhM6nxH1W9IoL8W3vORBsLGjd6kiutgivL6JPwYvn2VWt1DQp9FhbJVEtKp/it0hAjPSNYsBAkEA/tj5dgCRkLNm0V0rJyZNBSMI6anaRmRT5QFGGl5LkzKqcHnz/28MIrlqqvUCLdrwACoMuU9eraTwXBqU+nL8QQJBAO0/otYFcK13KM07k/aAsJBdjBgWl5L95jfR/z38v6CIU7IIg8V/LftCmqQBEKILwrgDqtfSbxsOXvdR9oNLLjsCQCTjJwiLgIZfUUyQncRm6NMLhSi9KxjxQKtvCcSbTXka5kytekHIwwrrp6LjH9OfUwnTDFBuSpf7vca3GkU+C4ECQGT4lGDp586rzB2soYhjtMF8TsdhthjFHlnbcfn7u8Kiwpweq5Y+Tl+FNTNfkKimwLR4OxmnYcnuD9TKeVPfh0kCQQDS1c3Al8gF9g9dlD0z5IXDUWgkVxad2iRjMSOIpblAvrpAHYmqaIame7zEMlkav7Q8osI4q6jHIPwCSLkFpj8n-----END RSA PRIVATE KEY-----2.私钥格式之间的转换问题java 代码,注意这⾥的私钥:是Pem私钥⽂件中去除头(-----BEGIN PRIVATE KEY-----)和尾(-----END PRIVATE KEY-----)以及换⾏符后的字符串1 /**2 * @data: 待加密的字符串3 * @privateKey: 私钥4 */5 public static String sign(byte[] data, String privateKey) throws Exception {67 byte[] keyBytes = new BASE64Decoder().decodeBuffer(privateKey);8 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);910 KeyFactory keyFactory = KeyFactory.getInstance("RSA");1112 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);1314 Signature signature = Signature.getInstance("SHA1withRSA");15 signature.initSign(priKey);16 signature.update(data);1718 return byte2hex(signature.sign());19 }c# 代码,注意这⾥的私钥:是Pem私钥⽂件中去除头(-----BEGIN RSA PRIVATE KEY-----)和尾(-----END RSA PRIVATE KEY-----)以及换⾏符后的字符串1 /// <summary>2 /// 签名3 /// </summary>4 /// <param name="data">待加密的字符串</param>5 /// <param name="privateKey">私钥</param>6 /// <returns></returns>7 public static string Sign(string data, string privateKey)8 {9 RSACryptoServiceProvider rsaCsp = LoadCertificate(privateKey);10 byte[] dataBytes = Encoding.UTF8.GetBytes(data);11 byte[] signatureBytes = rsaCsp.SignData(dataBytes, "SHA1");12 return Hex_2To16(signatureBytes);13 }1415 private static RSACryptoServiceProvider LoadCertificate(string privateKey)16 {17 byte[] res = res = Convert.FromBase64String(privateKey);18 try19 {20 RSACryptoServiceProvider rsa = DecodeRSAPrivateKey(res);21 return rsa;22 }23 catch (Exception ex)24 {25 }26 return null;27 }2829 private static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey)30 {31 byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;3233 // --------- Set up stream to decode the asn.1 encoded RSA private key ------34 MemoryStream mem = new MemoryStream(privkey);35 BinaryReader binr = new BinaryReader(mem); //wrap Memory Stream with BinaryReader for easy reading36 byte bt = 0;37 ushort twobytes = 0;38 int elems = 0;39 try40 {41 twobytes = binr.ReadUInt16();42 if (twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)43 binr.ReadByte(); //advance 1 byte44 else if (twobytes == 0x8230)45 binr.ReadInt16(); //advance 2 bytes46 else47 return null;4849 twobytes = binr.ReadUInt16();50 if (twobytes != 0x0102) //version number51 return null;52 bt = binr.ReadByte();53 if (bt != 0x00)54 return null;555657 //------ all private key components are Integer sequences ----58 elems = GetIntegerSize(binr);59 MODULUS = binr.ReadBytes(elems);6061 elems = GetIntegerSize(binr);62 E = binr.ReadBytes(elems);6364 elems = GetIntegerSize(binr);65 D = binr.ReadBytes(elems);6667 elems = GetIntegerSize(binr);68 P = binr.ReadBytes(elems);6970 elems = GetIntegerSize(binr);71 Q = binr.ReadBytes(elems);7273 elems = GetIntegerSize(binr);74 DP = binr.ReadBytes(elems);7576 elems = GetIntegerSize(binr);77 DQ = binr.ReadBytes(elems);7879 elems = GetIntegerSize(binr);80 IQ = binr.ReadBytes(elems);818283 // ------- create RSACryptoServiceProvider instance and initialize with public key -----84 CspParameters CspParameters = new CspParameters();85 CspParameters.Flags = eMachineKeyStore;86 RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024, CspParameters);87 RSAParameters RSAparams = new RSAParameters();88 RSAparams.Modulus = MODULUS;89 RSAparams.Exponent = E;90 RSAparams.D = D;91 RSAparams.P = P;92 RSAparams.Q = Q;93 RSAparams.DP = DP;94 RSAparams.DQ = DQ;95 RSAparams.InverseQ = IQ;96 RSA.ImportParameters(RSAparams);97 return RSA;98 }99 catch (Exception ex)100 {101 return null;102 }103 finally104 {105 binr.Close();106 }107 }108109 private static int GetIntegerSize(BinaryReader binr)110 {111 byte bt = 0;112 byte lowbyte = 0x00;113 byte highbyte = 0x00;114 int count = 0;115 bt = binr.ReadByte();116 if (bt != 0x02) //expect integer117 return 0;118 bt = binr.ReadByte();119120 if (bt == 0x81)121 count = binr.ReadByte(); // data size in next byte122 else123 if (bt == 0x82)124 {125 highbyte = binr.ReadByte(); // data size in next 2 bytes126 lowbyte = binr.ReadByte();127 byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };128 count = BitConverter.ToInt32(modint, 0);129 }130 else131 {132 count = bt; // we already have the data size133 }134135 while (binr.ReadByte() == 0x00)136 { //remove high order zeros in data137 count -= 1;138 }139 binr.BaseStream.Seek(-1, SeekOrigin.Current); //last ReadByte wasn't a removed zero, so back up a byte 140 return count;141 }142143144 /// <summary>145 /// 2进制转16进制146 /// </summary>147 public static String Hex_2To16(Byte[] bytes)148 {149 String hexString = String.Empty;150 Int32 iLength = 65535;151 if (bytes != null)152 {153 StringBuilder strB = new StringBuilder();154155 if (bytes.Length < iLength)156 {157 iLength = bytes.Length;158 }159160 for (int i = 0; i < iLength; i++)161 {162 strB.Append(bytes[i].ToString("X2"));163 }164 hexString = strB.ToString(); 165 }166 return hexString;167 }。

利用DES和RSA加密算法实现JAVA软件的注册授权策略

利用DES和RSA加密算法实现JAVA软件的注册授权策略
收稿 日期 :0 6— 5— 2 2 0 0 2
利用这个原理 , 我们 可以将类文件进行 加密 保存 , J M装 人 的 时候 对 Casodr 在 V l Lae 进行 定 s 制, 使之能找到经过加密后 的类代码 , 并对这些代 码进行解密后装载到 JM。由于解密后的字节码 V 文件保存在 内存 中, 以窃密者很难 得到解密后 所 的代码 。于是源代码加密的重点就转移到了对编
制 J M 把 该类 以及 所 有它 所需 要 的类关 联 到定 制 V
在 这里 , 们采 用 D S D t E cytnSad 我 E ( aa nrpi t o n
a) r 算法对类文件 的字节码进 行加密 和解 密, d 它
包 含在 J E软件 包 中 的 SnC rv e 中 。D S C uJ EPoi r d E
张 俊
( 青岛市住房保障中心 , 山东 青 岛 267 ) 60 1
提 要: 通过 J I 口调 用本 地 应 用程 序 读 取 用 户 主 机 的 硬 盘序 列 号作 为 用 户唯 一性 依 N接
据, 利用 R A加密算法实现用户信息和注册信息的加密保护和验证。本文介绍 了在 商用 J V S AA 软件开发过程中可以使用的一种注册验证策略的实现方法。 关 键词 : J VM 反 编译 加 密算 法 D S R A MD J I 硬盘 序 列号 E S 5 N
1 源 代码 加密
后 的类文件进行解密 。但解 密之 后 , 最终用户就 有 了一份不 加密的类文件 , 这和事先不进行加 密 没有 什么 差别 。 为了找到合适 的加密方法 , 我们需要从 Jv aa 程序在 J M上的执行过程人手。J M每次装人类 V V 文件时都需要一个称 为 Ca Lae 的对象 , l sodr s 这个 对象负责把新的类装人正在运行 的 J M。J M给 V V Ca Lae 一个包含 了待装人类 ( l sodr s 比如 j a 1 g a .a . v n O j t名字的字符 串, b c) e 然后 由 Casodr l L ae 负责找 s 到类文件 , 装人原始数据 , 并把它转换成一个 Ca ls s

RSAAES前端JS与后台JAVA的加密解密的是实现

RSAAES前端JS与后台JAVA的加密解密的是实现

RSAAES前端JS与后台JAVA的加密解密的是实现AES CryptoJS前提是编码⽅式,key,vi中设置⼀样,就可以进⾏跨语⾔加密解密<link rel="stylesheet" href="<%=basePath %>/css/login.css"><script src="<%=basePath %>jslib/jquery-1.8.3.js" type="text/javascript" ></script><script src="<%=basePath %>jslib/Common.js" type="text/javascript" ></script><script src="<%=basePath %>jslib/core-min.js" type="text/javascript" ></script><script src="<%=basePath %>jslib/aes.js" type="text/javascript" ></script></head><body><form action="<%=basePath %>login?action=goAES" id="login" name="form" method="post"><h1>Log In</h1><fieldset id="inputs"><input id="name" type="text" placeholder="Username" value="" autofocus required><!-- ming --><input id="pwd" name="pwd" type="password" placeholder="Password" value="" required></fieldset><fieldset id="actions"><input type="button" id="button" onclick="go()" value="登录"><a href="#" id="msg"></a></fieldset><input type="hidden" name="key" id="key"><!-- 密钥 --><input type="hidden" id="msg_source" value="0807060504030201"></form><script type="text/javascript">function go(){if(isEmptyById(['name','pwd'])){$('#msg').text('⽤户名或密码不能为空');return;}//var pwd = $("#pwd").val();//("加密前: "+pwd);//CryptoJS.AES.encrypt('明⽂','key');//var ecodeRestult = CryptoJS.AES.encrypt($("#pwd").val(),$("#msg_source").val());//("加密后:"+ecodeRestult);//$("#pwd").val(ecodeRestult);//CryptoJS.AES.decrypt('密⽂','key').toString(CryptoJS.enc.Utf8);//var decodeResult = CryptoJS.AES.decrypt(ecodeRestult,$("#msg_source").val()).toString(CryptoJS.enc.Utf8);//("解密后:"+decodeResult);var pwd = $("#pwd").val();var key = CryptoJS.enc.Utf8.parse($("#msg_source").val());var iv = CryptoJS.enc.Utf8.parse($("#msg_source").val());var srcs = CryptoJS.enc.Utf8.parse(pwd);var encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv,mode:CryptoJS.mode.CBC});$("#pwd").val(encrypted);$('#login').submit();}</script>这⾥需要注意的是$("#msg_source").val(); 因为key是动态的,需要从服务器提前设置好,前端AES JS加密指定是CryptoJS.mode.CBC模式,那么Java解密的同时也必须⽤这个模式来解密,不然会报错Given final block not properly padded...异常AES--Javapackage mon.kit;import org.apache.log4j.Logger;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import mons.codec.binary.Base64;public class AESKit {/*** Logger for this class*/private static final Logger logger = Logger.getLogger(AESKit.class);public static final String IV = "0807060504030201";/******************************************************************** AES加密算法* @author moyun* 加密⽤的Key 可以⽤26个字母和数字组成,最好不要⽤保留字符,虽然不会错,⾄于怎么裁决,个⼈看情况⽽定此处使⽤AES-128-CBC加密模式,key需要为16位。

用java编程实现RSA加密算法

用java编程实现RSA加密算法

用java编程实现RSA加密算法RSA加密算法是目前应用最广泛的公钥加密算法,特别适用于通过Internet传送的数据,常用于数字签名和密钥交换。

那么我今天就给大家介绍一下如何利用Java编程来实现RSA加密算法。

一、RSA加密算法描述RSA加密算法是1978年提出的。

经过多年的分析和研究,在众多的公开密钥加密算法中,RSA加密算法最受推崇,它也被推荐为公开密钥数据加密标准。

由数论知识可知,若将一个具有大素数因子的合数进行分解是很困难的,或者说这个问题的计算量是令人望而生畏的,而RSA加密算法正是建立在这个基础上的。

在RSA加密算法中,—个用户A可根据以下步骤来选择密钥和进行密码转换:(1)随机的选取两个不同的大素数p和q(一般为100位以上的十进制数),予以保密;(2)计算n=p*q,作为用户A的模数,予以公开;(3)计算欧拉(Euler)函数z=(p-1)*(q-1),予以保密;(4)随机的选取d与z互质,作为A的公开密钥;(5)利用Euclid算法计算满足同余方程e*d≡1modz的解d,作为用户A的保密密钥;(6)任何向用户A发送信息M的用户,可以用A的公开模数D和公开密钥e根据C=Me mod n得到密文C;RSA加密算法的安全性是基于大素数分解的困难性。

攻击者可以分解已知的n,得到p和q,然后可得到z;最后用Euclid算法,由e和z得到d。

然而要分解200位的数,需要大约40亿年。

二、用Java语言描述RSA加密算法的原理假设我们需要将信息从机器A传到机器B,首先由机器B随机确定一个private_kcy(我们称之为密钥),可将这个private_key始终保存在机器B中而不发出来。

然后,由这个private_key计算出public_key(我们称之为公钥)。

这个public_key的特性是:几乎不可能通过该public_key计算生成它的priyate_key。

接下来通过网络把这个public_key 传给机器A,机器A收到public_key后,利用public_key将信息加密,并把加密后的信息通过网络发送到机器B,最后机器B利用已知的pri.rate_key,就可以解开加密信息。

基于Java的RSA公钥密码算法的实现与探讨

基于Java的RSA公钥密码算法的实现与探讨

基于Java的RSA公钥密码算法的实现与探讨摘要:鉴于Java语言在网络上的安全特性和RSA加密算法的优越性,介绍了公钥密码体制的概念和RSA加密算法的原理,并在Java环境下实现RSA公钥密码算法。

关键词:安全体制;Java;公钥密码;RSA算法0 引言随着计算机网络技术的迅速发展,人类已步入数字化的信息时代。

通过网络进行远距离的、快速的信息交流和信息处理已变得越来越普遍。

同时,人们对信息的安全存储、安全处理和安全传输的需求也越来越迫切,但是,由于Internet 网络协议本身存在着重要的安全问题(IP包本身并不继承任何安全特性,很容易伪造出IP包的地址、修改其内容以及在传输途中拦截并查看包的内容),使网上的信息传输存在巨大的安全风险,因而数据安全越来越受到重视,算法工程技术上的实现也就有着重要的意义。

为了解决这一问题,保证数据的保密性,我们可以采用不同的加密算法对数据进行加密。

因为Java语言的安全性和网络处理能力较强,而且RSA加密算法的强大和难破解性,本文主要介绍使用RSA数据加密算法在Java环境下实现数据的安全传输。

1 Java安全体制Java 是Sun 公司开发的一种面向对象的编程语言,并且由于它的平台无关性被大量应用于Internet 的开发。

由于Java 主要用于网络应用程序开发,因此对安全性有较高的要求。

如果没有安全保证,用户从网络下载程序执行就非常危险。

Java通过自己的安全机制防止了病毒程序的产生和下载程序对本地系统的威胁破坏。

当Java字节码进入解释器时,首先必须经过字节码校验器的检查,然后,Java解释器将决定程序中类的内存布局,随后,类装载器负责把来自网络的类装载到单独的内存区域,避免应用程序之间相互干扰破坏。

最后,客户端用户还可以限制从网络上装载的类只能访问某些文件系统。

2 密码体制及RSA公钥密码2.1 公钥密码体制的概念首先我们要理解什么是密码的概念,简单的说它就是一组含有参数k的变换E。

RSA加密算法java代码:

RSA加密算法java代码:

1.RSA加密算法java代码:import java.math.BigInteger;public class RSA {private long p,q,e,d,n;public RSA(){int pIndex = (int)(Math.random()*10);int qIndex;int eIndex;do{qIndex = (int)(Math.random()*10);}while(qIndex==pIndex);do{eIndex = (int)(Math.random()*10);}while(eIndex==pIndex||eIndex==pIndex); p = 1033;q = 2017;e = 29437;n = p*q;d = calculateD();}private long calculateD(){long t0 = 0,t1 = 1,t2 = -1;long r0 = (p-1)*(q-1), m = r0,r1 = e ,r2 = -1; do{long q = r0/r1;r2 = r0-r1*q;if(r2==0)break;t2 = t0 - t1*q;while(t2<0){t2+=m;}if(t2>=m){t2 %= m;}r0 = r1;r1 = r2;t0 = t1;t1 = t2;}while(r2!=0);if(r1!=1){return 0;}else{return t2;}}public long getE() {return e;}public long getN() {return n;}public long getD() {return d;}public BigInteger encode(BigInteger data){ return pow(data,d).mod(new BigInteger(n+"")); }public BigInteger decode(BigInteger code){ return pow(code,e).mod(new BigInteger(n+"")); }public BigInteger pow(BigInteger data,long p){ data = data.pow((int)p);return data;}public static void main(String args[]){RSA rsa = new RSA();BigInteger data = new BigInteger("222222");long oldtime = System.currentTimeMillis();BigInteger code = rsa.encode(data);long newtime = System.currentTimeMillis();double codetime = ((double)(newtime-oldtime))/1000; oldtime = System.currentTimeMillis();BigInteger decode = rsa.decode(code);newtime = System.currentTimeMillis();double decodetime = ((double)(newtime-oldtime))/1000; System.out.println("privateKey:"+rsa.d);System.out.println("publickKey:"+rsa.e);System.out.println("N:"+rsa.n);System.out.println("data:"+data);System.out.println("code:"+code+" time:"+codetime); System.out.println("decode:"+decode+" time:"+decodetime);}}2.运行结果截图:。

RSA算法私钥公钥生成和导入秘钥库步骤,加签名和验签Java代码

RSA算法私钥公钥生成和导入秘钥库步骤,加签名和验签Java代码

RSA算法私钥公钥⽣成和导⼊秘钥库步骤,加签名和验签Java代码1)RSA私钥和公钥⽣成步骤步骤⼀,⽣成JKS⽂件ecouponNotificationRsa.jks,别名为:ecoupon_notification_key,期限20年,jks证书密码123456,算法是RSAkeytool -genkeypair -keyalg RSA -keysize 2048 -validity 7300 -dname "CN=disney, OU=disney, O=disney, L=shanghai, ST=shanghai, C=CN" -alias ecoupon_notification_key -keystore myRsa.jks -storepass 123456步骤⼆,查看JKS证书信息keytool -list -v -keystore ecouponNotificationRsa.jks -storepass 123456步骤三,根据 jks 私钥⽣成cer证书, cer证书密码设置为 555666keytool -export -alias my_service_key -keystore myRsa.jks -storepass 555666 -file myRsaPublicKey.cer步骤四,根据 cer 证书⽣成公钥,并将公钥导⼊到客户端秘钥库中(这⼀步是调⽤此service的对⽅app操作,需要借助第三步⽣成的cer证书)keytool -import -alias ecoupon_notification_rsa_public_key -file myRsaPublicKey.cer -keystore ecoupon_notification_rsa_public_key.jks -storepass 555666步骤五,将第⼀步⽣成好的jks证书的绝对路径地址配置到配置中⼼,例⼦如下rsa.private.key.jks.path=/key/library/myRsa.jksrsa.private.key.jks.password=123456rsa.public.key.certificate.alias=my_service_keyrsa.public.key.certificate.password=5556662)⽣成私钥 bean 和公钥 bean,注⼊到 spring 容器import java.io.FileInputStream;import java.io.IOException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.UnrecoverableKeyException;import java.security.cert.CertificateException;@Slf4j@Configurationpublic class ConfigRsa {@Bean("keyStore")public KeyStore getKeyStore(@Value("${rsa.private.key.jks.path}") String privateKeyJksPath,@Value("${rsa.private.key.jks.password}") String privateKeyJksPassword) throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException {try (FileInputStream fis = new FileInputStream(privateKeyJksPath)) {KeyStore keyStore = KeyStore.getInstance("JKS");keyStore.load(fis, privateKeyJksPassword.toCharArray());return keyStore;}}@Bean("privateKey")public PrivateKey getPrivateKey(@Qualifier("keyStore") KeyStore keyStore,@Value("${rsa.public.key.certificate.alias}") String publicKeyCertificateAlias,@Value("${rsa.public.key.certificate.password}") String publicKeyCertificatePassword) throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException {return (PrivateKey) keyStore.getKey(publicKeyCertificateAlias, publicKeyCertificatePassword.toCharArray());}@Bean("publicKey")public PublicKey getPublicKey(@Qualifier("keyStore") KeyStore keyStore,@Value("${rsa.public.key.certificate.alias}") String publicKeyCertificateAlias) throws KeyStoreException {return keyStore.getCertificate(publicKeyCertificateAlias).getPublicKey();}}3)⾃定义 RsaUtil 类去签名和验签import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import ponent;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.SignatureException;import java.util.Base64;@Slf4j@Component("rsaUtil")public class RsaUtil {private static final String ALGORITHM = "SHA256withRSA"; // sign type: RSA2, refer doc: https:///open/291/106115@Autowired@Qualifier("privateKey")private PrivateKey privateKey;@Autowired@Qualifier("publicKey")private PublicKey publicKey;public String sign(String originalData) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {Signature signature = Signature.getInstance(ALGORITHM);signature.initSign(privateKey);signature.update(originalData.getBytes());String signedData = java.util.Base64.getEncoder().encodeToString(signature.sign()).replace("\r\n","").replace("\n","");return signedData;}public boolean verify(String originalData, String signedData) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { Signature signature = Signature.getInstance(ALGORITHM);signature.initVerify(publicKey);signature.update(originalData.getBytes());boolean isVerify = signature.verify(Base64.getDecoder().decode(signedData));return isVerify;}}end.。

RSA密码算法及其Java实现

RSA密码算法及其Java实现

2 R A密码算法简 介 S
对称 密钥体 制 的特 点是 解密 密钥与 加密 密钥 相 同或者
肭 ; 瞥 ̄ p 曹: I K J

图 1 非ห้องสมุดไป่ตู้对称 密钥 体 制
很 容易从 加 密密钥 导 出解 密密钥 , 因而加 密密钥 的泄 露会
使 系统 变得 不安 全 。它 的一 个严 重缺 陷是在 任何 密文 传输 RS 密码 算法 是 由美国麻 省理 工学 院的 三位数 学家 : A
i r c l, a d po e h orcn s o h l r h t pi ie n rv s te cretes f te a oi m.Fn l w a e te g A cy t —a n i a a cm ue n e t j. s np g t i l ay, e m k h S rp o 培oj m w t J v o e t r ,a d t s t r t h
RSA c y t —aI rt m a d t Rea i a i n rpo go i h n Is l t o wih z t Ja a v
T N hn -y ,H N h , S a- u A G Z eg i A G Z U S i jn
{ .s b o op trS fw r n ho | / u  ̄ f Cm ue ot ae a Ter G / o n esy 6 ag 5 0 2 , .h a n d y, u hu uN ri z t “ n 5 0 5 P Ci ; n
Ro ad. Rie t 、 Ad . h mi 和 L o a d. lma n l L. v s , iS a r e n r Ad e n
之 前 ,发送 者和 接收者 必须 使用 一个安 全信 道预 先商 定和 传送密 钥 。而在 实际 的通讯 中,通信双 方则 很难 确定 一条

基于JAVA的RSA文件加密软件的设计与实现论文

基于JAVA的RSA文件加密软件的设计与实现论文

摘要分析RSA算法的应用现状,论证文件加密应用RSA算法的可行性和意义。

设计一套完整实用的RSA文件加密解决方案,具体编码实现。

对RSA算法进行研究,从常规RSA算法出发,用C++实现RSA加密算法类库,并在32位windows平台封装成组件。

在.Net平台引用此组件,实现可以对任意文件进行RSA加密操作的窗体应用程序。

经过加密的文件以及密钥文件都是文本文件。

给出关键类类图、整个应用程序的结构描述文档、关键模块流程图、较详细的接口文档、所有源代码。

对应用程序进行测试,对测试结果进行分析研究,进而对应用程序进行改进,对关键算法进行尽可能的优化,最终得到一个在windows运行的可以用指定密钥对任意文件进行RSA加密并可解密的完整应用程序,和一些相关的可移植组件。

关键词RSA RSA算法文件加密加密成文本AbstractDo research about the application area of RSA encryption and reason that RSA can be used for file encryption. Design a RSA file-encrypt solution and complete an application on Microsoft Windows™. Design a C++ class based on normal RSA algorithm. And make a DLL module based on the class. Then complete a .Net Framework™ window-application using that DLL. The application can encrypt any file and decrypt them. The file after encryption can be saved as a text file. And the encryption-keys also can be saved as text.Provide pivotal classes chart, project description, core algorithm flowchart, all source code, and module interfaces document. Do application performance test and record the performance data. Analyze the result then optimize core algorithm and improve the application. Finally, create a practical application using RSA algorithm that can encrypt and decrypt any file. And several modules in the project can be reuse by other applications. For instance, the C++ class can be cross-compiled for handheld devices, the DLL can be referenced by other win32 applications, and the .Net class can be easily referenced by web server applications or web services.Keywords RSA RSA algorithm file encryption encrypt to text目录前言 (4)第1章RSA应用现状及应用于文件加密的分析 (5)1.1 RSA算法介绍与应用现状 (5)1.2 RSA应用于文件加密的分析 (6)1.2.1 文件加密使用RSA的可行性 (6)1.2.2 文件加密使用RSA的意义 (7)第2章RSA文件加密软件的设计与实现 (9)2.1 需求分析与总体设计 (9)2.1.1 功能分析 (9)2.1.2 工程方案选择 (10)2.2 各部分的设计与开发 (11)2.2.1 实现RSA加密算法的C++核心类库 (11)2.2.2 封装C++核心类库的DLL组件 (21)2.2.3 引用DLL的.Net类与实现文件操作功能的窗体应用程序 (22)第3章软件整体测试与分析改进 (23)3.1 编写测试各项性能需要的精确计时类 (23)3.2 测试数据与分析改进 (23)3.2.1 密钥生成测试 (23)3.2.2 数据输入输出测试 (26)3.2.3 加密解密测试 (26)3.2.4 性能分析与改进优化 (29)3.3 使用中国余数定理 (30)第4章可移植模块的简要说明与开发前景 (32)结束语 (33)谢辞 (34)参考文献 (35)附录 (36)前言RSA公钥加密算法是第一个既能用于数据加密也能用于数字签名的算法。

DES、AES、RSA等常用加密算法介绍与比较

DES、AES、RSA等常用加密算法介绍与比较

DES、AES、RSA等常用加密算法介绍与比较文本先简单介绍常用的加密算法,后面将逐步推送每个加密算法的加密原理与应用及 java 实现方式。

加密算法分对称加密和非对称算法,其中对称加密算法的加密与解密密钥相同,非对称加密算法的加密密钥与解密密钥不同,此外,还有一类不需要密钥的散列算法。

常见的对称加密算法主要有 DES、3DES、AES 等,常见的非对称算法主要有 RSA、DSA 等,散列算法主要有 SHA-1、MD5 等。

对称算法又可分为两类。

一次只对明文中的单个位(有时对字节)运算的算法称为序列算法或序列密码。

另一类算法是对明文的一组位进行运算(即运算之前将明文分为若干组,然后分别对每一组进行运算,这些位组称为分组),相应的算法称为分组算法或分组密码。

DES 加密算法DES 加密算法是一种分组密码,以 64 位为分组对数据加密,它的密钥长度是 56 位,加密解密用同一算法。

DES 加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。

这样,只有掌握了和发送方相同密钥的人才能解读由 DES 加密算法加密的密文数据。

因此,破译 DES 加密算法实际上就是搜索密钥的编码。

对于 56 位长度的密钥来说,如果用穷举法来进行搜索的话,其运算次数为 2 的 56 次方。

3DES(Triple DES)是基于 DES 的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高;AES 加密算法AES 加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度的最少支持为 128、192、256,分组长度 128 位,算法应易于各种硬件和软件实现。

这种加密算法是美国联邦政府采用的区块加密标准,AES 标准用来替代原先的 DES,已经被多方分析且广为全世界所使用。

RSA 加密算法RSA 加密算法是目前最有影响力的公钥加密算法,并且被普遍认为是目前最优秀的公钥方案之一。

RSA 是第一个能同时用于加密和数宇签名的算法,它能够抵抗到目前为止已知的所有密码攻击,已被 ISO 推荐为公钥数据加密标准。

java rsa 公钥指数 模数

java rsa 公钥指数 模数

java rsa 公钥指数模数
RSA加密算法是一种非对称加密算法,它使用公钥和私钥来加
密和解密数据。

在RSA算法中,公钥和私钥都包含了指数和模数两
个关键参数。

首先,公钥包含了指数和模数两个参数。

指数通常是一个较小
的质数,用于加密数据。

模数是两个大素数的乘积,用于加密和解
密数据。

在Java中,可以使用java.security包中的PublicKey类
来表示RSA公钥,其中包含了getPublicExponent()和getModulus()方法来获取公钥的指数和模数。

getPublicExponent()方法返回公钥的指数,通常是65537
(0x10001)这样的固定值,因为这个值比较小且安全。

而getModulus()方法返回公钥的模数,这是一个大整数,用于进行加
密运算。

在使用RSA算法时,我们通常会从外部获取公钥的指数和模数,然后使用这些参数来初始化PublicKey对象,进而进行加密操作。

因此,公钥的指数和模数是RSA算法中非常重要的两个参数,它们
共同构成了公钥的基本信息,用于加密数据。

总之,RSA公钥包含了指数和模数两个关键参数,其中指数用于加密数据,而模数用于加密和解密数据。

在Java中,可以通过PublicKey类的getPublicExponent()和getModulus()方法来获取公钥的指数和模数。

这些参数对于理解和使用RSA算法非常重要。

java rsa keypair的用法

java rsa keypair的用法

文章标题:探索Java RSA Keypair的用法和原理一、介绍在现代的信息传输和数据保护领域,加密算法起着至关重要的作用。

RSA加密算法是一种非对称加密算法,具有安全性高、加密速度快等特点,被广泛应用于网络通信、数据传输等领域。

在Java编程中,使用RSA Keypair可以实现信息的加密和解密,确保数据的安全性。

本文将重点探讨Java中RSA Keypair的用法和原理。

二、RSA Keypair的生成在Java中,使用RSA加密算法需要先生成一对RSA Keypair,即公钥和私钥。

在这一部分,将介绍如何在Java中生成RSA Keypair,以及如何将其应用到信息加密和解密中。

1. RSA Keypair的生成方法我们需要使用Java的密钥对生成工具来生成RSA Keypair。

在Java 中,我们可以使用KeyPairGenerator类来生成RSA Keypair。

这个过程涉及到一些参数的设置,比如密钥长度、随机数生成器等。

2. 密钥对的导出和存储生成了RSA Keypair之后,需要将其导出并存储在安全的地方。

RSA Keypair可以以不同的格式进行导出,比如DER编码、PEM格式等。

在Java中,可以使用PrivateKey和PublicKey类来表示私钥和公钥,然后将其存储在文件中或者直接用于加密解密操作。

3. RSA Keypair的应用一旦生成了RSA Keypair,并且将其导出和存储好,就可以开始在Java程序中应用RSA加密算法了。

通过加载导出的私钥和公钥,可以实现信息的加密和解密操作。

三、RSA加密和解密在这一部分,将介绍如何在Java中使用已经生成的RSA Keypair来进行信息加密和解密操作。

也会讨论RSA加密算法的原理和作用。

1. 信息的加密在Java中,可以使用Cipher类来进行信息的加密操作。

通过加载公钥,可以将需要传输的信息进行加密,然后发送给接收方。

java rsa 加密解密流程

java rsa 加密解密流程

java rsa 加密解密流程RSA是一种非对称加密算法,用于数据的加密和解密。

它涉及到公钥和私钥的使用,其中公钥用于加密数据,私钥用于解密数据。

下面是Java中使用RSA 加密和解密的基本流程:1. 生成密钥对:首先需要生成一对RSA密钥,包括公钥和私钥。

可以使用Java提供的`KeyPairGenerator`类来生成密钥对。

```javaKeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048); // 指定密钥长度KeyPair keyPair = keyPairGenerator.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();```2. 加密数据:使用公钥对需要加密的数据进行加密。

可以使用`Cipher`类来进行加密操作。

```javaString data = "Hello, World!";Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedData = cipher.doFinal(data.getBytes());```3. 解密数据:使用私钥对加密后的数据进行解密,还原为原始数据。

```javacipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedData = cipher.doFinal(encryptedData);String decryptedText = new String(decryptedData);```请注意,以上示例代码只是一个简单的RSA加密和解密流程的示例。

java后台加密解密方法

java后台加密解密方法

java后台加密解密方法Java后台加密解密方法在当今互联网安全领域中具有重要意义。

为了保护数据的安全,各种加密算法应运而生。

本文将介绍几种常见的Java后台加密解密方法,包括RSA、AES、DES和SM2。

1.RSA加密解密原理及实现RSA是一种非对称加密算法,其公钥和私钥是成对存在的。

使用公钥加密后的数据只能通过私钥进行解密。

在Java中,我们可以使用KeyPairGenerator生成一对公私钥,然后使用RSAPrivateKey对数据进行解密。

2.AES加密解密原理及实现AES是一种对称加密算法,加密和解密过程使用相同的密钥。

在Java中,我们可以使用Java的加密库如Java Cryptography Extension (JCE)实现AES 加密解密。

3.DES加密解密原理及实现DES是一种对称加密算法,其加密过程和解密过程使用不同的密钥。

在Java中,我们可以使用Java Cryptography Extension (JCE)实现DES加密解密。

4.SM2加密解密原理及实现SM2是一种国密算法,具有非对称加密和对称加密的特点。

在前端,我们可以使用SM2加密请求参数,然后在后台使用对应的私钥进行解密。

在Java 中,我们可以使用Hutool库实现SM2加密解密。

5.总结:选择合适的加密解密方法及注意事项在实际应用中,选择合适的加密解密方法至关重要。

需要考虑数据安全性、算法复杂度、性能和兼容性等因素。

此外,还需注意以下几点:- 加密解密算法应根据实际需求进行选择,如对称加密算法适用于加密大量数据,非对称加密算法适用于加密少量数据;- 加密密钥和解密密钥应妥善保管,避免泄露;- 在传输加密数据时,应注意防范中间人攻击,可以使用SSL/TLS等安全协议进行保护;- 定期更新和升级加密算法,以应对潜在的安全威胁。

本文介绍了Java后台加密解密方法,包括RSA、AES、DES和SM2。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、RSA加密算法的原理
(1)、RSA算法描述
RSA公钥密码体制的基本原理:根据数论,寻求两个大素数比较简单,而将他们的乘积分解开则极为困难。

(2)、RSA算法密钥计算过程:
1.用户秘密选取两个大素数p 和q,计算n=pq,n称为
RSA算法的模数,公开。

2.计算出n的欧拉函数Φ(n) = (p-1)×(q-1),保密。

3.从(1, Φ(n))中随机地选择一个与Φ(n)互素的数e作为加
密密钥,公开。

4.计算出满足下式的d 作为解密密钥,保密。

ed=1 mod Φ(n)
(3)、RSA算法密钥:
加密密钥PK = |e, n| 公开
解密密钥SK = |d, n| 保密
(4)、RSA算法加密解密过程:
RSA算法属于分组密码,明文在加密前要进行分组,分组
的值m 要满足:0 < m < n
加密算法:C = E(m) ≡me mod n
解密算法:m = D(c) ≡cd mod n
(5)、RSA算法的几点说明:
1.对于RSA算法,相同的明文映射出相同的密文。

2.RSA算法的密钥长度:是指模数n的长度,即n的二进
制位数,而不是e或d的长度。

3.RSA的保密性基于大数进行因式分解很花时间,因此,
进行RSA加密时,应选足够长的密钥。

512bit已被证明
不安全,1024bit也不保险。

4.RSA最快情况也比DES慢100倍,仅适合少量数据的加
密。

公钥e取较小值的方案不安全。

二.RSA公钥加密算法的编程实现
以下程序是java编写的实现RSA加密及解密的算法
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.crypto.Cipher;
//RSATest类即为测试类
public class RSATest {
//主函数
public static void main(String[] args) {
try {
RSATest encrypt = new RSATest();
String encryptText = "encryptText";//输入的明文
KeyPair keyPair = encrypt.generateKey();//调用函数生成密钥对,函数见下
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
byte[] e = encrypt.encrypt(publicKey, encryptText.getBytes());
//调用自己编写的encrypt函数实现加密,
byte[] de = encrypt.decrypt(privateKey, e);
//调用自己编写的decrypt函数实现解密,
System.out.println(toHexString(e)); //输出结果,采用ASSIC码形式
System.out.println(toHexString(de));
} catch (Exception e) {
e.printStackTrace();
}
}
// generateKey密钥对生成函数的实现
public KeyPair generateKey() throws NoSuchAlgorithmException { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); //返回生成指定算法的public/private 密钥对的KeyPairGenerator 对象。

keyPairGen.initialize(1024, new SecureRandom());
//使用给定的随机源(和默认的参数集合)初始化确定密钥大小的密钥对生成器。

KeyPair keyPair = keyPairGen.generateKeyPair();//生成一个密钥对
return keyPair;
}
// encrypt加密函数
protected byte[] encrypt(RSAPublicKey publicKey, byte[] data) { if (publicKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
//返回实现指定转换的Cipher对象。

cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//用密钥初始化此Cipher,第一个参数表示加密
return cipher.doFinal(data);
//按单部分操作加密或解密数据,或者结束一个多部分操作。

数据将被加密或解密(具体取决于此Cipher 的初始化方式)。

} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
// decrypt解密函数
protected byte[] decrypt(RSAPrivateKey privateKey, byte[] raw) { if (privateKey != null) {
try {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey); //第一个参数表示解密
return cipher.doFinal(raw);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
// toHexString将字节数组变为ASSIC码表示的字符串
public static String toHexString(byte[] b) {
StringBuilder sb = new StringBuilder(b.length * 2);
//构造一个不带任何字符的字符串生成器,其初始容量由capacity参数指定。

for (int i = 0; i < b.length; i++) {
sb.append(HEXCHAR[(b[i] & 0xf0) >>> 4]);
// append方法始终将这些字符添加到生成器的末端;而insert方法则在指定的点添加字符。

//调用HEXCHAR方法
sb.append(HEXCHAR[b[i] & 0x0f]);
}
return sb.toString();
}
//构建一个HEXCHAR数组
private static char[] HEXCHAR = { '0', '1', '2', '3', '4', '5', '6', '7','8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}
小结:
RSA公开密钥的加密算法实现方法如上所述,我们先是调用API生成了RSA的密钥对,然后调用API实现了加密与解密,最终通过编译的函数实现了字符数组的字符串输出,且输出的是字符串的ASSIC.。

相关文档
最新文档