`
hareamao
  • 浏览: 3670 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

PublicKey加密解密入门代码

阅读更多
看到这个问题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
0
0
分享到:
评论

相关推荐

    加密解密 技术内幕 适合入门

    9. **密码学标准**:如PKCS(Public Key Cryptography Standards)、FIPS(Federal Information Processing Standards)等,为加密解密提供统一的标准和指南。 10. **现代密码学发展**:随着量子计算的发展,传统...

    jsencrypt.min.js通过JSEncrypt分段加密解密

    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在内的各种字符。对于英文字符,我们可以直接使用字母表,但对于非英文字符,可能需要...

    Java加密与解密艺术

    - `SecretKeySpec`和`PublicKey`、`PrivateKey`用于封装密钥,供`Cipher`使用。 4. 示例代码 - 对称加密: ```java KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey ...

    Java加密和数字签名编程快速入门[整理].pdf

    Java中,`java.security.KeyPairGenerator`用于生成密钥对,`java.security.PublicKey`和`java.security.PrivateKey`分别代表公钥和私钥,`javax.crypto.Cipher`用于加密和解密操作。4)数字签名:数字签名是一种...

    java实现的加密算法

    byte[] encrypted = cipher.doFinal(dataToEncrypt, publicKey); byte[] decrypted = cipher.doFinal(encrypted, privateKey); ``` 4. **文件加密**: Java中可以使用`java.io`和`javax.crypto`包结合,将文件...

    openssl rsa算法加密

    6. **应用领域**:RSA不仅用于数据加密,还广泛应用于数字签名、SSL/TLS协议、代码签名、证书等场景。 7. **性能和限制**:RSA算法在处理大数据量时效率较低,通常只用于加密小规模的数据(如对称加密的密钥)或...

    PKI入门级介绍

    为了确保在互联网上进行的各种交易和服务能够安全可靠,**公开密钥基础设施(Public Key Infrastructure, PKI)**的应用变得日益广泛。 #### 二、PKI基础知识 **公开密钥基础设施(PKI)**是一种基于公钥加密技术的...

    密码学入门知识点.pdf

    2. **非对称加密**(Public-Key Cryptography / Asymmetric Cryptography):加密和解密使用不同的密钥(公钥和私钥),其中公钥可以公开,而私钥必须保密。这种技术主要用于加密少量数据或者用于密钥交换。 3. **...

    PKI基础知识入门,密码学,CA基础

    PKI(Public Key Infrastructure,公共密钥基础设施)是基于密码学原理,用于保障网络通信安全的一套体系。它为用户提供了一种安全的方式来验证信息的真实性和完整性,同时保护数据的机密性。在PKI中,主要涉及到...

    openssl制作公钥密钥操作文档,小白级别

    至此,你已经掌握了OpenSSL的基本操作,包括生成RSA密钥对、查看密钥信息、加密解密、创建自签名证书以及数据签名验证。这些知识对于理解和实现网络安全传输至关重要。在实际应用中,根据具体需求,你可能还需要学习...

    go-knapsackcrypto:Go中的背包加密系统

    在Go中实施背包加密系统。... 我猜在现实情况下,您将与纯文本消息一起加密一些代码,该代码可使解密方知道消息实际上有多长时间。 公钥的位数是超级递增序列长度的2倍乘以2的幂,然后,公钥的位数随超

    GPG Crypto From Gnu Manual

    公钥密码解决了密钥分发的问题,但加密解密速度较慢。典型的公钥加密算法有RSA、DSA等。 **混合密码系统**:结合了对称密码和公钥密码的优点。通常先使用公钥加密一个随机生成的对称密钥,然后使用该对称密钥加密...

    Network Security with OpenSSL 免费

    - **EVP Public Key API**:OpenSSL提供的用于公钥操作的高级API。 - **接口调用示例**:展示如何调用该API完成公钥操作。 #### 8.6 对象编码与解码 - **编码格式**:介绍常用的编码格式如DER、PEM等。 - **编码...

    应用密码学(完整版)

    - **公钥基础设施**(Public Key Infrastructure, PKI):一种支持使用公钥加密技术的安全框架。 #### 五、对称密钥加密 对称密钥加密是密码学中最古老且最常用的技术之一。它依赖于相同的密钥来加密和解密数据。...

    Privacy and Authentication An introduction to cryptography

    公钥密码学(Public Key Cryptography)是一种利用一对密钥进行加密和解密的技术,其中一个是公开的公钥,另一个是保密的私钥。这种机制使得加密消息可以使用接收者的公钥完成,而只有拥有相应私钥的接收者才能解密...

    pki(公钥基础设施)课件

    PKIX(Public Key Infrastructure using X.509)是基于X.509标准的PKI模型,可能详细介绍了PKIX的层次结构,包括根CA、中间CA和终端实体证书的关系,以及证书路径验证的规则。 **6. 认证与PKI(第9章)** 认证是PKI...

    电力系统ssh

    SSH 通过公钥基础设施(Public Key Infrastructure, PKI)实现身份验证,即用户和服务器之间交换公钥,然后使用私钥解密数据,确保只有拥有正确私钥的用户才能访问系统。 在电力系统中,SSH的应用尤为重要,因为...

    PKI 技术与发展(了解发展状况,有助入门)

    公钥基础设施(Public Key Infrastructure,简称PKI)作为一种新兴的网络安全技术和安全服务规范,已经初步形成了一套完整的解决方案,能够有效地解决大多数网络安全问题。PKI基于公开密钥理论和技术构建了一个安全...

Global site tag (gtag.js) - Google Analytics