加密是保证数据安全的手段之一。加密是将纯文本数据转换为难以理解的密文;解密是将密文转换回纯文本。
数据的加解密属于密码学的范畴。通常,加密和解密都需要使用一些秘密信息,这些秘密信息叫做密钥,将纯文本转为密文或者转回的时候都要用到这些密钥。
对称加密指的是发送者和接收者共用同一个密钥的加解密方法。
非对称加密(又称公钥加密)指的是需要一个私有密钥一个公开密钥,两个不同的密钥的加解密体系。尽管不同,这个密钥对的这两个部分在算法上是有关联的。一个密钥将纯文本加密,另一个将密文解密。没有一个密钥能够把加密和加密的功能全部自己完成。公钥,或者用于加密数据的密钥,可以被自由分发。
RSA 是基于大整数分解的公钥加密的算法之一。RSA 代表了 Ron Rivest、Adi Shamir 和 Leonard Adleman 三人,RSA 就是他们一起提出的。
以下示例就展示了如何在 Java 中使用 RSA 算法对信息进行加解密。
java.security.KeyPairGenerator 类的实例用于产生一个 RSA 算法的公钥和私钥对,之后将其保存到文件。
javax.crypto.Cipher 类的实例用于使用上面产生的密钥对对信息进行加解密。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.Cipher; /** * @author JavaDigest * */ public class EncryptionUtil { /** * String to hold name of the encryption algorithm. */ public static final String ALGORITHM = "RSA"; /** * String to hold the name of the private key file. */ public static final String PRIVATE_KEY_FILE = "C:/keys/private.key"; /** * String to hold name of the public key file. */ public static final String PUBLIC_KEY_FILE = "C:/keys/public.key"; /** * Generate key which contains a pair of private and public key using 1024 * bytes. Store the set of keys in Prvate.key and Public.key files. * * @throws NoSuchAlgorithmException * @throws IOException * @throws FileNotFoundException */ public static void generateKey() { try { final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM); keyGen.initialize(1024); final KeyPair key = keyGen.generateKeyPair(); File privateKeyFile = new File(PRIVATE_KEY_FILE); File publicKeyFile = new File(PUBLIC_KEY_FILE); // Create files to store public and private key if (privateKeyFile.getParentFile() != null) { privateKeyFile.getParentFile().mkdirs(); } privateKeyFile.createNewFile(); if (publicKeyFile.getParentFile() != null) { publicKeyFile.getParentFile().mkdirs(); } publicKeyFile.createNewFile(); // Saving the Public key in a file ObjectOutputStream publicKeyOS = new ObjectOutputStream( new FileOutputStream(publicKeyFile)); publicKeyOS.writeObject(key.getPublic()); publicKeyOS.close(); // Saving the Private key in a file ObjectOutputStream privateKeyOS = new ObjectOutputStream( new FileOutputStream(privateKeyFile)); privateKeyOS.writeObject(key.getPrivate()); privateKeyOS.close(); } catch (Exception e) { e.printStackTrace(); } } /** * The method checks if the pair of public and private key has been generated. * * @return flag indicating if the pair of keys were generated. */ public static boolean areKeysPresent() { File privateKey = new File(PRIVATE_KEY_FILE); File publicKey = new File(PUBLIC_KEY_FILE); if (privateKey.exists() && publicKey.exists()) { return true; } return false; } /** * Encrypt the plain text using public key. * * @param text * : original plain text * @param key * :The public key * @return Encrypted text * @throws java.lang.Exception */ public static byte[] encrypt(String text, PublicKey key) { byte[] cipherText = null; try { // get an RSA cipher object and print the provider final Cipher cipher = Cipher.getInstance(ALGORITHM); // encrypt the plain text using the public key cipher.init(Cipher.ENCRYPT_MODE, key); cipherText = cipher.doFinal(text.getBytes()); } catch (Exception e) { e.printStackTrace(); } return cipherText; } /** * Decrypt text using private key. * * @param text * :encrypted text * @param key * :The private key * @return plain text * @throws java.lang.Exception */ public static String decrypt(byte[] text, PrivateKey key) { byte[] dectyptedText = null; try { // get an RSA cipher object and print the provider final Cipher cipher = Cipher.getInstance(ALGORITHM); // decrypt the text using the private key cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text); } catch (Exception ex) { ex.printStackTrace(); } return new String(dectyptedText); } /** * Test the EncryptionUtil */ public static void main(String[] args) { try { // Check if the pair of keys are present else generate those. if (!areKeysPresent()) { // Method generates a pair of keys using the RSA algorithm and stores it // in their respective files generateKey(); } final String originalText = "Text to be encrypted "; ObjectInputStream inputStream = null; // Encrypt the string using the public key inputStream = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE)); final PublicKey publicKey = (PublicKey) inputStream.readObject(); final byte[] cipherText = encrypt(originalText, publicKey); // Decrypt the cipher text using the private key. inputStream = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE)); final PrivateKey privateKey = (PrivateKey) inputStream.readObject(); final String plainText = decrypt(cipherText, privateKey); // Printing the Original, Encrypted and Decrypted Text System.out.println("Original: " + originalText); System.out.println("Encrypted: " +cipherText.toString()); System.out.println("Decrypted: " + plainText); } catch (Exception e) { e.printStackTrace(); } } }
相关推荐
网络上很多例子看起来是对的,但实际对接中,总是对接不上,可能是两种语言差异性造成,或者是JAVA 生成密钥经过特殊处理造成,且对方又无法交流(同种语言加解密又没问题)。但C#标准方法 RSA与AES 加解密就是解不...
在这个例子中,A和B之间的通信是通过Socket实现的,数据在Socket连接上进行加密和解密操作,确保了在传输过程中的安全性。 在实际应用中,Java提供了强大的库支持这些功能。例如,`java.security`包提供了RSA密钥...
本文将深入探讨如何在Nginx中实现RSA加密,并使用Java进行解密,以此来保护数据的安全性。 首先,让我们了解RSA加密算法的基础。RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对密钥——公钥和私钥...
RSA加密算法,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息...本资源是通过Android、java实现的RSA加密的例子,可供大家参考学习。
本文将详细解析如何使用Java实现公钥和私钥的加解密操作,以及相关的关键概念和代码示例。 首先,我们要了解公钥和私钥的基本原理。在非对称加密算法中,每一对密钥由一个公钥和一个私钥组成。公钥是公开的,可以被...
总的来说,这个实例为我们展示了如何在Java中使用DES加密算法进行数据加密和解密。在实际开发中,为了增强安全性,开发者通常会转向更强大的加密算法(如AES),并结合安全的密钥管理和存储机制。同时,非对称加密和...
工程根目录下mds5/src/com/目录下有两个例子: 其中DES.java是DES算法的对称加密解密 其中RSA.java是RSA算法的非对称加密解密 项目只给出了加密解密方法,并没有给出保存密钥的方法
在`Demo.java`的源代码中,可能会看到如何创建和管理密钥,以及如何使用`Cipher`类进行加解密操作的示例。`t.obj`文件可能存储了加密后的数据,或者是解密过程中的中间结果,具体用途取决于代码的实现。 为了深入...
BouncyCastle,又称BC,是一个开源的Java安全包,提供了广泛的密码学功能,包括但不限于加解密、数字签名、证书管理以及哈希算法。标题提到的"BouncyCastle加解密包15on-1.60"指的是该库的一个特定版本,版本号为...
这个例子展示了如何在Java中生成RSA密钥对,并使用公钥加密、私钥解密字符串。请注意,实际应用中,密钥通常需要被安全地存储和传输,而不是直接硬编码在代码中。 **总结** RSA加密算法在Java中的实现涉及到密钥对...
在Java服务器端,我们通常使用`Java Cryptography Extension (JCE)`库进行解密。以下是一个解密示例: 1. 首先,导入必要的JCE库,并创建RSA密钥对象: ```java import java.security.KeyFactory; import java....
本篇将详细讲解Java中的对称加密和非对称加密,并结合实际例子进行阐述。 1. 对称加密: 对称加密是一种常见的加密方式,它使用相同的密钥进行加密和解密。Java中常见的对称加密算法有DES(Data Encryption ...
这个Java实现的示例提供了RSA加密和解密的功能,并且结合了`sun.misc.BASE64Decoder.jar`来处理Base64编码,使得加密后的密文能够以可读的形式存储和传输。 首先,RSA的核心原理基于大数因子分解的困难性。每个RSA...
2. **Java实现RSA**:在Java中,我们可以使用`java.security`包下的`KeyPairGenerator`和`Cipher`类来生成RSA密钥对并进行加密解密操作。首先,我们需要生成一对公钥和私钥,公钥用于加密,私钥用于解密。 3. **...
### Java中对字符串进行加密和解密的知识点详解 #### 1. 引言 在实际的软件开发过程中,为了确保数据的安全性,经常会遇到需要对数据进行加密和解密的情况,例如保护用户密码或保障网络传输数据的安全。虽然密码学...
// 使用密钥进行加解密操作 ``` **实例分析** 在提供的"张也弛的RSA实例"压缩包中,可能包含了一些Java程序,这些程序展示了如何使用上述原理和方法进行RSA加密和解密。例如,可能会有一个类用于生成密钥对,另一...
在Java编程语言中,数据加密和解密是安全领域中的重要组成...对于初学者,理解并实践这些例子是提升Java安全编程技能的重要步骤。同时,开发者还需要关注加密算法的安全更新和最佳实践,以应对不断演变的网络安全威胁。
在提供的压缩包文件中,`RSA_master.iml`是IntelliJ IDEA项目的配置文件,`src`目录可能包含了实现RSA加解密的Java源代码,`.idea`目录则包含了IDE的项目设置信息。如果需要深入学习和理解,你可以查看这些源代码,...
下面是一个具体的例子,展示了如何生成RSA密钥对并使用这些密钥进行加解密操作。 ```java import java.io.*; import java.security.*; import javax.crypto.Cipher; public class RSATool { public static void ...