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

RSA非对称加密java实现模拟

    博客分类:
  • java
 
阅读更多

Java中RSA非对称密钥加解密使用示例

 

一、简介:
RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它。RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名。这个算法经受住了多年深入的密码分析,虽然密码分析者既不能证明也不能否定RSA的安全性,但这恰恰说明该算法有一定的可信性,目前它已经成为最流行的公开密钥算法。

二、RSA的公钥、私钥的组成,以及加密、解密的公式可见于下表

三、使用方式:

①  假设A、B机器进行通信,已A机器为主;

②  A首先需要用自己的私钥为发送请求数据签名,并将公钥一同发送给B;

③  B收到数据后,需要用A发送的公钥进行验证,已确保收到的数据是未经篡改的;

④  B验签通过后,处理逻辑,并把处理结果返回,返回数据需要用A发送的公钥进行加密(公钥加密后,只能用配对的私钥解密);

⑤  A收到B返回的数据,使用私钥解密,至此,一次数据交互完成。

四、代码示例:

  1. 第一步获取私钥,为签名做准备。
    复制代码
    /** 
         * 读取私钥  返回PrivateKey 
         * @param path  包含私钥的证书路径 
         * @param password  私钥证书密码 
         * @return 返回私钥PrivateKey 
         * @throws KeyStoreException 
         * @throws NoSuchAlgorithmException 
         * @throws CertificateException 
         * @throws IOException 
         * @throws UnrecoverableKeyException 
         */  
        private static PrivateKey getPrivateKey(String path,String password)  
                throws KeyStoreException, NoSuchAlgorithmException, CertificateException,  
                IOException, UnrecoverableKeyException {  
            KeyStore ks = KeyStore.getInstance("PKCS12");  
            FileInputStream fis = new FileInputStream(path);  
            char[] nPassword = null;  
            if ((password == null) || password.trim().equals("")) {  
                nPassword = null;  
            } else {  
                nPassword = password.toCharArray();  
            }  
            ks.load(fis, nPassword);  
            fis.close();  
            Enumeration<String> en = ks.aliases();  
            String keyAlias = null;  
            if (en.hasMoreElements()) {  
                keyAlias = (String) en.nextElement();  
            }  
       
            return (PrivateKey) ks.getKey(keyAlias, nPassword);  
        }  
    复制代码

     

     
  2. 签名示例  通过第一步得到的私钥,进行签名操作,具体请看以下代码:
    复制代码
    /** 
         * 私钥签名: 签名方法如下:BASE64(RSA(MD5(src),privatekey)),其中src为需要签名的字符串, 
    privatekey是商户的CFCA证书私钥。 
         * @param plainText 待签名字符串 
         * @param path 签名私钥路径 
         * @param password  签名私钥密码 
         * @return 返回签名后的字符串 
         * @throws Exception 
         */  
        public static String sign(String plainText,String path,String password)  
                throws Exception  {  
            /* 
             * MD5加密 
             */  
            MessageDigest md5 = MessageDigest.getInstance("MD5");  
            md5.update(plainText.getBytes("utf-8"));  
            byte[] digestBytes = md5.digest();  
            /* 
             * 用私钥进行签名 RSA 
             * Cipher负责完成加密或解密工作,基于RSA 
             */  
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");  
            //ENCRYPT_MODE表示为加密模式  
            cipher.init(Cipher.ENCRYPT_MODE, getPrivateKey(path, password));  
            //加密  
            byte[] rsaBytes = cipher.doFinal(digestBytes);  
            //Base64编码  
            return Base64.byteArrayToBase64(rsaBytes); 
    复制代码

     

     
  3. B收到数据后,需要使用A提供的公钥信息进行验签,此处使用公钥的N、E进行验签
    首先通过公钥N、E得到公钥PublicKey,如下:

     

    复制代码
    /**  
         * 根据公钥n、e生成公钥 
         * @param modulus   公钥n串 
         * @param publicExponent  公钥e串 
         * @return 返回公钥PublicKey 
         * @throws Exception 
         */  
        public static PublicKey getPublickKey(String modulus, String publicExponent)  
                throws Exception {  
            KeySpec publicKeySpec = new RSAPublicKeySpec(  
                    new BigInteger(modulus, 16), new BigInteger(publicExponent, 16));  
            KeyFactory factory = KeyFactory.getInstance("RSA");  
            PublicKey publicKey = factory.generatePublic(publicKeySpec);  
            return publicKey;  
        }  
    复制代码

     

     

    得到公钥PublicKey后,再去验证签名,代码如下:

    复制代码
    /** 
         * 用公钥证书进行验签 
         * @param message  签名之前的原文 
         * @param cipherText  签名 
         * @param pubKeyn 公钥n串 
         * @param pubKeye 公钥e串 
         * @return boolean 验签成功为true,失败为false 
         * @throws Exception 
         */  
        public static boolean verify(String message, String cipherText,String pubKeyn,  
                String pubKeye) throws Exception {  
            Cipher c4 = Cipher.getInstance("RSA/ECB/PKCS1Padding");  
            // 根据密钥,对Cipher对象进行初始化,DECRYPT_MODE表示解密模式  
            c4.init(Cipher.DECRYPT_MODE, getPublickKey(pubKeyn,pubKeye));  
            // 解密  
            byte[] desDecTextBytes = c4.doFinal(Base64.base64ToByteArray(cipherText));  
            // 得到前置对原文进行的MD5  
            String md5Digest1 = Base64.byteArrayToBase64(desDecTextBytes);  
            MessageDigest md5 = MessageDigest.getInstance("MD5");  
            md5.update(message.getBytes("utf-8"));  
            byte[] digestBytes = md5.digest();  
            // 得到商户对原文进行的MD5  
            String md5Digest2 = Base64.byteArrayToBase64(digestBytes);  
            // 验证签名  
            if (md5Digest1.equals(md5Digest2)) {  
                return true;  
            } else {  
                return false;  
            }  
        }  
    复制代码

    至此,签名验签已经完毕

  4. 提供一个从.cer文件读取公钥的方法:
    复制代码
    /** 
         * 读取公钥cer 
         * @param path .cer文件的路径  如:c:/abc.cer 
         * @return  base64后的公钥串 
         * @throws IOException 
         * @throws CertificateException 
         */  
        public static String getPublicKey(String path) throws IOException,  
        CertificateException{  
            InputStream inStream = new FileInputStream(path);  
            ByteArrayOutputStream out = new ByteArrayOutputStream();  
            int ch;  
            String res = "";  
            while ((ch = inStream.read()) != -1) {  
                out.write(ch);  
            }  
            byte[] result = out.toByteArray();  
            res = Base64.byteArrayToBase64(result);  
            return res;  
        }  
    复制代码

     

     
  5. 附上所有代码: http://pan.baidu.com/share/link?shareid=23044&uk=2986731784

    本文转自:http://www.huosen.net/archives/124.html
分享到:
评论

相关推荐

    RSA密码算法及其JaVa实现

    ### RSA密码算法及其Java实现 #### 一、引言 随着计算机技术和互联网的快速发展,信息安全问题日益凸显。...通过Java语言实现这一算法,有助于更好地理解和掌握非对称密钥体制的关键概念和技术。

    java模仿QQ通信实现RSA加密解密

    RSA是一种非对称加密算法,由两个密钥——公钥和私钥组成。公钥用于加密,私钥用于解密。在QQ通信中,为了保护用户信息和聊天内容的安全,我们可以使用RSA进行数据加密。发送方使用接收方的公钥加密数据,只有持有...

    可搜索加密

    在可搜索加密的实现中,一般会结合使用对称加密(如DES)和公钥加密(如RSA)技术。对称加密用于高效地加密大量数据,而公钥加密则用于安全地交换对称密钥,使得只有客户端和服务器才能解密通信内容。这种混合策略在...

    RSA:模拟 RSA 加密的 Java 应用程序

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,例如数字签名、数据加密等。本项目是一个使用Java实现的RSA加密模拟程序,旨在帮助开发者理解和运用RSA算法。 在RSA加密中,有两个关键的密钥:公钥...

    Java学习~实现输入字符的加密与解密

    - **RSA**:非对称加密算法,安全性高,但速度相对较慢,常用于密钥交换和数字签名。 - **DES(Data Encryption Standard)**:较老的对称加密算法,已被AES取代,但在某些场景下仍有应用。 3. **对称加密与非...

    RSA加密解密的Android的演示Demo

    RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,是现代密码学的基石之一。它广泛应用于数据加密、数字签名等领域,尤其在移动应用如Android中,用于保护敏感数据的安全传输和...

    RSA一般攻击方式(Java).zip

    RSA算法是一种非对称加密算法,它在信息安全领域扮演着重要的角色,特别是在数据加密和数字签名中。这个压缩包文件包含了一些与RSA攻击方式相关的Java程序,分别命名为Brocast、Factor、Together、Choose和Main。...

    jmeter利用bean shell加密解密方法.docx

    RSA 是一种非对称加密算法,它使用一对公钥和私钥,其中公钥用于加密,私钥用于解密。在 JMeter 中,你需要获取 RSA 加密的 Java 代码或由开发人员提供的加密库(jar 包)。如果已获得 jar 包,将其放入 JMeter 安装...

    java源码包---java 源码 大量 实例

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    java实现的类似qq聊天系统

    可能使用的是对称加密如AES(Advanced Encryption Standard)或非对称加密如RSA,保证信息在传输过程中的安全性。 6. **网络安全**:网络安全在聊天系统中至关重要。HTTPS协议可能被用于提供安全的网络通信,防止...

    bob_and_alice.rar_ALICE_Java Alice bob

    这些API支持各种加密算法,包括对称加密(如AES、DES)、非对称加密(RSA、ECC)以及哈希函数(MD5、SHA系列)等。 2. **对称加密**: 在这个模拟程序中,可能使用了对称加密算法,例如AES(高级加密标准)。对称...

    java源码包2

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    java源码包3

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目源代码 java开源包2

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    java自带crypto库使用示例

    1. **加密与解密**:使用`Cipher`接口,我们可以实现对称加密和非对称加密。对称加密如AES(高级加密标准),非对称加密如RSA。以下是一个简单的AES加密和解密的示例: ```java import javax.crypto.Cipher; import...

    RandomPassword:模拟没有加密的简单RSA算法实现随机密码

    RSA是一种非对称加密算法,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因其发明者的名字首字母而得名。这种算法基于大数因子分解的困难性,为数据传输和存储提供了安全保障。 **RSA算法原理** RSA的...

    mima.rar_java 认证

    Java的`javax.crypto.Cipher`类提供了对称加密(如AES)和非对称加密(如RSA)的支持。对称加密用于大量数据的快速加密,而非对称加密用于密钥交换,确保只有合法用户能解密信息。SSL/TLS协议在Web通信中广泛用于...

    模拟private key加密算法的ssl通信

    2. **公钥与私钥原理**:在SSL/TLS中,非对称加密算法如RSA、DSA等被用于密钥交换。公钥是公开的,任何人都可以获取,而私钥必须保密。公钥用于加密数据,私钥用于解密。 3. **SSL握手过程**: - 客户端发起连接...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四”...

Global site tag (gtag.js) - Google Analytics