和NET互通的RSA加密算法

这篇博客主要记录了如何实现C#后台与Java移动端RSA加密解密的互通问题,详细介绍了Java端的RSA工具类,包括密钥对生成、公钥与C#格式的转换,以及Android应用中进行加密解密的步骤。提供了项目源码的下载链接。
摘要由CSDN通过智能技术生成
    常见的安全加密算法,包括MD5、SHA、DES、AES、RSA等。先简单介绍一下RSA:RSA是目前最有影响力的公钥加密算法,将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。RSA在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

通常网上的RSA加密解密都是Java语言和其他互通的,由于我们后台是C#,所以互通起来不太一样,网上找了一些资料也不太全,基本都是java语言的,因此记录一下。
java RSA 参考博客:http://blog.csdn.net/jdsjlzx/article/details/41441147

这个是加密用的一个工具类,与一般不一样的就是有将C#的公钥与java的转换

package com.weipan.rsa;

import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.util.Date;

import javax.crypto.Cipher;

public class RsaHelper {
/**
* 生成RSA密钥对(默认密钥长度为1024)
*
* @return
*/
public static KeyPair generateRSAKeyPair() {
return generateRSAKeyPair(1024);
}

/**
 * 生成RSA密钥对
 * 
 * @param keyLength
 *            密钥长度,范围:512~2048
 * @return
 */
public static KeyPair generateRSAKeyPair(int keyLength) {
    try {
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA/ECB/PKCS1Padding");
        kpg.initialize(keyLength);
        return kpg.genKeyPair();
    } catch (NoSuchAlgorithmException e) {
        return null;
    }
}

/*
 * java端公钥转换成C#公钥
 * 
 * */
public static String encodePublicKeyToXml(PublicKey key) {
    if (!RSAPublicKey.class.isInstance(key)) {
        return null;
    }
    RSAPublicKey pubKey = (RSAPublicKey) key;
    StringBuilder sb = new StringBuilder();

    sb.append("<RSAKeyValue>");
    sb.append("<Modulus>").append(
            Base64Helper.encode(pubKey.getModulus().toByteArray())).append(
            "</Modulus>");
    sb.append("<Exponent>").append(
            Base64Helper.encode(pubKey.getPublicExponent().toByteArray()))
            .append("</Exponent>");
    sb.append("</RSAKeyValue>");
    return sb.toString();
}

/*
 * C#端公钥转换成java公钥
 * <RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1
 * Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
 * */
public static PublicKey decodePublicKeyFromXml(String xml) {
    xml = xml.replaceAll("\r", "").replaceAll("\n", "");
    BigInteger modulus = new BigInteger(1, Base64Helper.decode(StringUtils
            .getMiddleString(xml, "<Modulus>", "</Modulus>")));
    BigInteger publicExponent = new BigInteger(1, Base64Helper
            .decode(StringUtils.getMiddleString(xml, "<Exponent>",
                    "</Exponent>")));

    RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus,
            publicExponent);

    KeyFactory keyf;
    try {
        keyf = KeyFactory.getInstance("RSA");
        return keyf.generatePublic(rsaPubKey);
    } catch (Exception e) {
        return null;
    }
}

/*
 * C#端私钥转换成java私钥
 * 
 * */
public static PrivateKey decodePrivateKeyFromXml(String xml) {
    xml = xml.replaceAll("\r", "").replaceAll("\n", "");
    BigInteger modulus = new BigInteger(1, Base64Helper.decode(StringUtils
            .getMiddleString(xml, "<Modulus>", "</Modulus>")));
    BigInteger publicExponent = new BigInteger(1, Base64Helper
            .decode(StringUtils.getMiddleString(xml, "<Exponent>",
                    "</Exponent>")));
    BigInteger privateExponent = new BigInteger(1, Base64Helper
            .decode(StringUtils.getMiddleString(xml, "<D>", "</D>")));
    BigInteger primeP = new BigInteger(1, Base64Helper.decode(StringUtils
            .getMiddleString(xml, "<P>", "</P>")));
    BigInteger primeQ = new BigInteger(1, Base64Helper.decode(StringUtils
            .getMiddleString(xml, "<Q>", "</Q>")));
    BigInteger primeExponentP = new BigInteger(1, Base64Helper
            .decode(StringUtils.getMiddleString(xml, "<DP>", "</DP>")));
    BigInteger primeExponentQ = new BigInteger(1, Base64Helper
            .decode(StringUtils.getMiddleString(xml, "<DQ>", "</DQ>")));
    BigInteger crtCoefficient = new BigInteger(1, Base64Helper
            .decode(StringUtils.getMiddleString(xml, "<InverseQ>",
                    "</InverseQ>")));

    RSAPrivateCrtKeySpec rsaPriKey = new RSAPrivateCrtKeySpec(modulus,
            publicExponent, privateExponent, primeP, primeQ,
            primeExponentP, primeExponentQ, crtCoefficient);

    KeyFactory keyf;
    try {
        keyf = KeyFactory.getInstance("RSA");
        return keyf.generatePrivate(rsaPriKey);
    } catch (Exception e) {
        return null;
    }
}

/*
 * java端私钥转换成C#私钥
 * 
 * */
public static String encodePrivateKeyToXml(PrivateKey key) {
    if (!RSAPrivateCrtKey.class.isInstance(key)) {
        return null;
    }
    RSAPrivateCrtKey priKey = (RSAPrivateCrtKey) key;
    StringBuilder sb = new StringBuilder();

    sb.append("<RSAKeyValue>");
    sb.append("<Modulus>").append(
            Base64Helper.encode(priKey.getModulus().toByteArray())).append(
            "</Modulus>");
    sb.append("<Exponent>").append(
            Base64Helper.encode(priKey.getPublicExponent().toByteArray()))
            .append("</Exponent>");
    sb.append("<P>").append(
            Base64Helper.encode(priKey.getPrimeP().toByteArray())).append(
            "</P>");
    sb.append("<Q>").append(
            Base64Helper.encode(priKey.getPrimeQ().toByteArray())).append(
            "</Q>");
    sb.append("<DP>").append(
            Base64Helper.encode(priKey.getPrimeExponentP().toByteArray()))
            .append("</DP>");
    sb.append("<DQ>").append(
            Base64Helper.encode(priKey.getPrimeExponentQ().toByteArray()))
            .append("</DQ>");
    sb.append("<InverseQ>").append(
            Base64Helper.encode(priKey.getCrtCoefficient().toByteArray()))
            .append("</InverseQ>");
    sb.append("<D>").append(
            Base64Helper.encode(priKey.getPrivateExponent().toByteArray()))
            .append("</D>");
    sb.append("</RSAKeyValue>");
    return sb.toString();
}

// 用公钥加密
public static byte[] encryptData(byte[] data, PublicKey pubKey) {
    try {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        return cipher.doFinal(data);
    } catch (Exception e) {
        return null;
    }
}

// 用私钥解密
public static byte[] decryptData(byte[] encryptedData, PrivateKey priKey) {
    try {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, priKey);
        return cipher.doFinal(encryptedData);
    } catch (Exception e) {
        return null;
    }
}

/**
 * 根据指定公钥进行明文加密
 * 
 * @param plainText
 *            要加密的明文数据
 * @param pubKey
 *            公钥
 * @return
 */
public static String e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值