看到这个问题
http://www.iteye.com/problems/71360,决定试一试加密解密,结果如下:
环境:JDK 1.7.0
import java.io.ByteArrayOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class PublicKeyTest {
public static void main(String args[]) throws
NoSuchProviderException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException,
IllegalBlockSizeException, BadPaddingException,
IOException {
final KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024, new SecureRandom());
final KeyPair kp = kpg.generateKeyPair();
final PrivateKey priKey = kp.getPrivate();
final PublicKey pubKey = kp.getPublic();
String encrypted = encrypt(pubKey, "公共密匙", "UTF8");
System.out.println(encrypted);
String decrypted = decrypt(priKey, encrypted, "UTF8");
System.out.println(decrypted);
FileWriter writer = new FileWriter("text.txt");
writer.write(decrypted);
writer.flush();
writer.close();
}
private static String encrypt(PublicKey pubKey, String message, String encoding) throws
NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException,
BadPaddingException, IOException {
// Get a cipher object.
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] bytes = message.getBytes(encoding);
// encode the message
final byte[] raw = doSafeFinal(cipher, bytes);
// converts to base64 for easier display.
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(raw);
}
private static String decrypt(PrivateKey priKey, String encrypted, String encoding) throws
InvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, IllegalBlockSizeException,
BadPaddingException, IOException {
//decode the BASE64 coded message
BASE64Decoder decoder = new BASE64Decoder();
byte[] raw = decoder.decodeBuffer(encrypted);
// Get a cipher object.
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
// decode the message
final byte[] bytes = doSafeFinal(cipher, raw);
// converts the decoded message to a String
return new String(bytes, encoding);
}
private static byte[] doSafeFinal(Cipher cipher, byte[] text) throws
IllegalBlockSizeException, BadPaddingException,
IOException {
// avoid overrun the block size of the cipher
int blockSize = cipher.getBlockSize();
if (blockSize > 0) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
int len;
for (int offset = 0; offset < text.length; offset += blockSize) {
if (text.length - offset <= blockSize) {
len = text.length - offset;
} else {
len = blockSize;
}
out.write(cipher.doFinal(text, offset, len));
}
return out.toByteArray();
} else {
return cipher.doFinal(text);
}
}
}
注意:源文件要求UTF-8格式
参考文献:
1 JDK API 文档
2 JCE offers an API to leverage asymmetric cryptography
http://www.techrepublic.com/article/jce-offers-an-api-to-leverage-asymmetric-cryptography/1049434
3 Secret Key Cryptography Tutorial
http://www.wikijava.org/wiki/Secret_Key_Cryptography_Tutorial
4 What's wrong with IBM's JCE provider?
http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14578218
分享到:
相关推荐
9. **密码学标准**:如PKCS(Public Key Cryptography Standards)、FIPS(Federal Information Processing Standards)等,为加密解密提供统一的标准和指南。 10. **现代密码学发展**:随着量子计算的发展,传统...
function encryptSegments(text, publicKey) { var encryptor = new JSEncrypt(); encryptor.setPublicKey(publicKey); var segments = splitTextIntoChunks(text, MAX_RSA_BLOCK_SIZE); var encryptedSegments ...
在Java中实现恺撒加密解密算法,我们需要考虑以下几个关键点: 1. 字符编码:Java使用Unicode编码,所以我们需要处理包括ASCII在内的各种字符。对于英文字符,我们可以直接使用字母表,但对于非英文字符,可能需要...
- `SecretKeySpec`和`PublicKey`、`PrivateKey`用于封装密钥,供`Cipher`使用。 4. 示例代码 - 对称加密: ```java KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey ...
Java中,`java.security.KeyPairGenerator`用于生成密钥对,`java.security.PublicKey`和`java.security.PrivateKey`分别代表公钥和私钥,`javax.crypto.Cipher`用于加密和解密操作。4)数字签名:数字签名是一种...
byte[] encrypted = cipher.doFinal(dataToEncrypt, publicKey); byte[] decrypted = cipher.doFinal(encrypted, privateKey); ``` 4. **文件加密**: Java中可以使用`java.io`和`javax.crypto`包结合,将文件...
6. **应用领域**:RSA不仅用于数据加密,还广泛应用于数字签名、SSL/TLS协议、代码签名、证书等场景。 7. **性能和限制**:RSA算法在处理大数据量时效率较低,通常只用于加密小规模的数据(如对称加密的密钥)或...
为了确保在互联网上进行的各种交易和服务能够安全可靠,**公开密钥基础设施(Public Key Infrastructure, PKI)**的应用变得日益广泛。 #### 二、PKI基础知识 **公开密钥基础设施(PKI)**是一种基于公钥加密技术的...
2. **非对称加密**(Public-Key Cryptography / Asymmetric Cryptography):加密和解密使用不同的密钥(公钥和私钥),其中公钥可以公开,而私钥必须保密。这种技术主要用于加密少量数据或者用于密钥交换。 3. **...
PKI(Public Key Infrastructure,公共密钥基础设施)是基于密码学原理,用于保障网络通信安全的一套体系。它为用户提供了一种安全的方式来验证信息的真实性和完整性,同时保护数据的机密性。在PKI中,主要涉及到...
至此,你已经掌握了OpenSSL的基本操作,包括生成RSA密钥对、查看密钥信息、加密解密、创建自签名证书以及数据签名验证。这些知识对于理解和实现网络安全传输至关重要。在实际应用中,根据具体需求,你可能还需要学习...
在Go中实施背包加密系统。... 我猜在现实情况下,您将与纯文本消息一起加密一些代码,该代码可使解密方知道消息实际上有多长时间。 公钥的位数是超级递增序列长度的2倍乘以2的幂,然后,公钥的位数随超
公钥密码解决了密钥分发的问题,但加密解密速度较慢。典型的公钥加密算法有RSA、DSA等。 **混合密码系统**:结合了对称密码和公钥密码的优点。通常先使用公钥加密一个随机生成的对称密钥,然后使用该对称密钥加密...
- **EVP Public Key API**:OpenSSL提供的用于公钥操作的高级API。 - **接口调用示例**:展示如何调用该API完成公钥操作。 #### 8.6 对象编码与解码 - **编码格式**:介绍常用的编码格式如DER、PEM等。 - **编码...
- **公钥基础设施**(Public Key Infrastructure, PKI):一种支持使用公钥加密技术的安全框架。 #### 五、对称密钥加密 对称密钥加密是密码学中最古老且最常用的技术之一。它依赖于相同的密钥来加密和解密数据。...
公钥密码学(Public Key Cryptography)是一种利用一对密钥进行加密和解密的技术,其中一个是公开的公钥,另一个是保密的私钥。这种机制使得加密消息可以使用接收者的公钥完成,而只有拥有相应私钥的接收者才能解密...
PKIX(Public Key Infrastructure using X.509)是基于X.509标准的PKI模型,可能详细介绍了PKIX的层次结构,包括根CA、中间CA和终端实体证书的关系,以及证书路径验证的规则。 **6. 认证与PKI(第9章)** 认证是PKI...
SSH 通过公钥基础设施(Public Key Infrastructure, PKI)实现身份验证,即用户和服务器之间交换公钥,然后使用私钥解密数据,确保只有拥有正确私钥的用户才能访问系统。 在电力系统中,SSH的应用尤为重要,因为...
公钥基础设施(Public Key Infrastructure,简称PKI)作为一种新兴的网络安全技术和安全服务规范,已经初步形成了一套完整的解决方案,能够有效地解决大多数网络安全问题。PKI基于公开密钥理论和技术构建了一个安全...