public static void main(String[] args) throws Exception { // TODO Auto-generated method stub HashMap<String, Object> map = RSAUtils.getKeys(); //生成公钥和私钥 RSAPublicKey publicKey = (RSAPublicKey) map.get("public"); RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private"); //模 String modulus = publicKey.getModulus().toString(); //公钥指数 String public_exponent = publicKey.getPublicExponent().toString(); //私钥指数 String private_exponent = privateKey.getPrivateExponent().toString(); //明文 String ming = "123456789"; //使用模和指数生成公钥和私钥 RSAPublicKey pubKey = RSAUtils.getPublicKey(modulus, public_exponent); RSAPrivateKey priKey = RSAUtils.getPrivateKey(modulus, private_exponent); //加密后的密文 String mi = RSAUtils.encryptByPublicKey(ming, pubKey); System.err.println(mi); //解密后的明文 ming = RSAUtils.decryptByPrivateKey(mi, priKey); System.err.println(ming); }
package yyy.test.rsa; import java.math.BigInteger; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; import java.util.HashMap; import javax.crypto.Cipher; public class RSAUtils { /** * 生成公钥和私钥 * @throws NoSuchAlgorithmException * */ public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException{ HashMap<String, Object> map = new HashMap<String, Object>(); KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); map.put("public", publicKey); map.put("private", privateKey); return map; } /** * 使用模和指数生成RSA公钥 * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA * /None/NoPadding】 * * @param modulus * 模 * @param exponent * 指数 * @return */ public static RSAPublicKey getPublicKey(String modulus, String exponent) { try { BigInteger b1 = new BigInteger(modulus); BigInteger b2 = new BigInteger(exponent); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2); return (RSAPublicKey) keyFactory.generatePublic(keySpec); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 使用模和指数生成RSA私钥 * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA * /None/NoPadding】 * * @param modulus * 模 * @param exponent * 指数 * @return */ public static RSAPrivateKey getPrivateKey(String modulus, String exponent) { try { BigInteger b1 = new BigInteger(modulus); BigInteger b2 = new BigInteger(exponent); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2); return (RSAPrivateKey) keyFactory.generatePrivate(keySpec); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 公钥加密 * * @param data * @param publicKey * @return * @throws Exception */ public static String encryptByPublicKey(String data, RSAPublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 模长 int key_len = publicKey.getModulus().bitLength() / 8; // 加密数据长度 <= 模长-11 String[] datas = splitString(data, key_len - 11); String mi = ""; //如果明文长度大于模长-11则要分组加密 for (String s : datas) { mi += bcd2Str(cipher.doFinal(s.getBytes())); } return mi; } /** * 私钥解密 * * @param data * @param privateKey * @return * @throws Exception */ public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); //模长 int key_len = privateKey.getModulus().bitLength() / 8; byte[] bytes = data.getBytes(); byte[] bcd = ASCII_To_BCD(bytes, bytes.length); System.err.println(bcd.length); //如果密文长度大于模长则要分组解密 String ming = ""; byte[][] arrays = splitArray(bcd, key_len); for(byte[] arr : arrays){ ming += new String(cipher.doFinal(arr)); } return ming; } /** * ASCII码转BCD码 * */ public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) { byte[] bcd = new byte[asc_len / 2]; int j = 0; for (int i = 0; i < (asc_len + 1) / 2; i++) { bcd[i] = asc_to_bcd(ascii[j++]); bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4)); } return bcd; } public static byte asc_to_bcd(byte asc) { byte bcd; if ((asc >= '0') && (asc <= '9')) bcd = (byte) (asc - '0'); else if ((asc >= 'A') && (asc <= 'F')) bcd = (byte) (asc - 'A' + 10); else if ((asc >= 'a') && (asc <= 'f')) bcd = (byte) (asc - 'a' + 10); else bcd = (byte) (asc - 48); return bcd; } /** * BCD转字符串 */ public static String bcd2Str(byte[] bytes) { char temp[] = new char[bytes.length * 2], val; for (int i = 0; i < bytes.length; i++) { val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f); temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0'); val = (char) (bytes[i] & 0x0f); temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0'); } return new String(temp); } /** * 拆分字符串 */ public static String[] splitString(String string, int len) { int x = string.length() / len; int y = string.length() % len; int z = 0; if (y != 0) { z = 1; } String[] strings = new String[x + z]; String str = ""; for (int i=0; i<x+z; i++) { if (i==x+z-1 && y!=0) { str = string.substring(i*len, i*len+y); }else{ str = string.substring(i*len, i*len+len); } strings[i] = str; } return strings; } /** *拆分数组 */ public static byte[][] splitArray(byte[] data,int len){ int x = data.length / len; int y = data.length % len; int z = 0; if(y!=0){ z = 1; } byte[][] arrays = new byte[x+z][]; byte[] arr; for(int i=0; i<x+z; i++){ arr = new byte[len]; if(i==x+z-1 && y!=0){ System.arraycopy(data, i*len, arr, 0, y); }else{ System.arraycopy(data, i*len, arr, 0, len); } arrays[i] = arr; } return arrays; } }
java Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); android Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding"); 参考: http://stackoverflow.com/questions/6069369/rsa-encryption-difference-between-java-and-android http://stackoverflow.com/questions/2956647/rsa-encrypt-with-base64-encoded-public-key-in-android
copy from : http://blog.csdn.net/centralperk/article/details/8558678
相关推荐
在Java中,可以使用Java Cryptography Architecture(JCA)来实现RSA加密解密算法。JCA提供了一个完整的加密解决方案,包括密钥对生成、加密和解密等功能。 知识点3:密钥对生成 在RSA加密解密算法中,密钥对的...
使用RSA非对称加密完成Java后端RSA加密和分段加解密,最近研究了RSA非对称加密,关于什么是RSA,网上各种文章一搜一大把,由于RSA的特性,一个1024位的密钥只能加密117位...下面就给出如何完成后端RSA加解密和分段加解密
由于Java的RSA加解密一般都是用RSA/ECB/PKCS1PADDING,导致Python一般的RSA加密库的加解密结果与Java的不兼容,Python下目前能与之兼容的RSA的库目前发现的只有一个,就是m2crypto。 这个库目前的问题是在windows...
java rsa 加解密 包含界面,随机生成密钥
在Java中实现RSA加密解密,需要使用Java Cryptography Extension (JCE)库。以下是使用RSA加密解密的基本步骤: 1. **生成密钥对**:首先,我们需要生成一对公钥和私钥。在Java中,`java.security.KeyPairGenerator`...
Java实现RSA加解密工具类Demo是一个典型的非对称加密技术的应用示例,RSA是一种广泛使用的公开密钥加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出。它基于大数因子分解的困难性,提供了安全的...
Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍 项目: JAVA生成的RSA的密文,通过C++来解密。 RSA这里就不多介绍了大家自己去看。 JAVA也是通过包来实现加密和解密的,那么我的C++是通过OPENSSL的库来实现的...
在给定的“java_RSA2048加密解密.zip”压缩包中,包含了前后端实现RSA2048加密解密的示例代码,使得开发者可以轻松地将这种安全机制集成到自己的项目中。 首先,我们需要理解RSA算法的基本原理。RSA(Rivest–...
在这个案例中,"Test"和"Javaworkspace"可能是包含代码示例或者测试数据的文件夹,可能包含C#和Java的实现代码,用于演示如何处理上述步骤,以实现RSA加密解密和签名验签的互通。 在实际应用中,还需要考虑其他因素...
在Java编程语言中,RSA(Rivest-Shamir-...总结来说,RSA加密解密工具类在Java中是一个重要的安全组件,用于保护数据的安全传输和存储。理解并正确使用RSA算法及其相关的Java API对于开发安全的网络应用程序至关重要。
在PHP中,我们可以使用openssl扩展来实现RSA加解密。例如,`openssl_pkey_new()`函数用于生成密钥对,`openssl_public_encrypt()`和`openssl_private_decrypt()`分别用于加密和解密数据。而在Java中,我们可以利用`...
"C# RSA加密与JAVA解密,实现相互通信"的主题聚焦于如何利用RSA公钥/私钥加密算法在C#和Java两个不同的编程环境中实现安全的数据交换。RSA是一种非对称加密算法,它使用一对密钥——公钥和私钥,公钥用于加密,私钥...
在Java中实现RSA加解密,主要涉及到Java的`java.security`和`javax.crypto`这两个包。首先,我们需要生成一对公钥和私钥,这通常通过`KeyPairGenerator`类来完成。以下是一段创建RSA密钥对的示例代码: ```java ...
在Java中,`java.security`和`javax.crypto`包提供了必要的接口和类来实现RSA加解密。例如,`KeyPairGenerator`用于生成公钥和私钥对,`Cipher`用于进行加解密操作。 在描述中提到的"解决长度限制",这是因为在RSA...
在Java中,我们可以使用Java Cryptography Extension (JCE)库来实现RSA的加密和解密操作。 首先,我们需要了解RSA的基本概念。RSA算法包含两个密钥:公钥和私钥。公钥可以公开给任何人,用于加密数据;而私钥必须...
通过JNI,我们可以在C/C++代码中实现RSA加解密函数,然后在Java层调用这些函数。这样,密钥和加密算法的实现就远离了可反编译的Java代码。 在实现过程中,我们还需要涉及DES和BASE64编码。DES是一种块加密算法,...
Java RSA 加密解密是指使用 Java 语言实现 RSA 加密和解密算法。RSA 是一种非对称加密算法,由 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人于 1978 年共同发明。RSA 加密算法的安全性基于大数分解的难度和 ...
java go RSA互相加解密 go rsa加密后可以用 java解密, java rsa加密后 可以用解密, 要把 txt文件中的秘钥和私钥 都复制粘贴到java 文件和go 文件 ,公钥和私钥统一才可以
在Java中实现RSA加解密,我们需要使用`java.security`包中的相关类。首先,我们需要生成一对公钥和私钥。这通常通过`KeyPairGenerator`类完成,指定算法为"RSA",然后通过`generateKeyPair()`方法生成包含公钥...
本话题主要关注如何在C#和Java之间通过RSA和DES加密算法实现数据的安全互通。RSA是一种非对称加密算法,适用于小量数据加密,如密钥交换;而DES是对称加密算法,适合大量数据的快速加密,但安全性相对较低。 首先,...