Java RSA非对称加密

                       Android RSA非对称加密

什么是Rsa加密

RSA算法是最流行的公钥密码算法,使用长度可以变化的密钥。RSA是第一个既能用于数据加密也能用于数字签名的算法。

RSA算法原理如下:

1.随机选择两个大质数p和q,p不等于q,计算N=pq;

2.选择一个大于1小于N的自然数e,e必须与(p-1)(q-1)互素。

3.用公式计算出d:d×e = 1 (mod (p-1)(q-1)) 。

4.销毁p和q。 最终得到的N和e就是“公钥”,d就是“私钥”,发送方使用N去加密数据,接收方只有使用d才能解开数据内容。 
RSA的安全性依赖于大数分解,小于1024位的N已经被证明是不安全的,而且由于RSA算法进行的都是大数计算, 
使得RSA最快的情况也比DES慢上倍,这是RSA最大的缺陷,因此通常只能用于加密少量数据或者加密密钥, 但RSA仍然不失为一种高强度的算法。

这边例子只做参考:

/**
 * Created by Xinghai.Zhao on 17/08/28.
 */
public class RSAUtils {
    private static final String RSA = "RSA";
    private static final String PUBLIC_KEY = "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMmubFxxN1TI7RGpUvaBMOT2QsEcjj2aJF8V4yq9fqBEd50x6i6bPe8A3myBeZILxunSp9n6RXIWgijXH8fktd8CAwEAAQ==";

    /** 非对称加密 */
    public static String getEncodeData(String s) {
        try {
            byte[] buffer = Base64.decode(PUBLIC_KEY, Base64.DEFAULT);
            KeyFactory keyFactory = KeyFactory.getInstance(RSA);
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            PublicKey publicKey = keyFactory.generatePublic(keySpec);
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] bytes = cipher.doFinal(s.getBytes());
            return Base64.encodeToString(bytes, Base64.DEFAULT);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }

    /** 非对称解密 */
    public static String getDecodeData(String s) {
        try {
            PublicKey publicKey = KeyFactory.getInstance(RSA).generatePublic(new X509EncodedKeySpec(Base64.decode(PUBLIC_KEY,Base64.DEFAULT)));
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            cipher.doFinal(Base64.decode(s,Base64.NO_CLOSE));
            byte[] result = cipher.doFinal(Base64.decode(s,Base64.DEFAULT));
            return new String(result,"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
    }
}

为系统而生,为框架而死,为debug奋斗一辈子; 吃符号的亏,上大小写的当,最后死在需求上。

猜你喜欢

转载自blog.csdn.net/qq_39731011/article/details/81626718