关于RSA解码乱码问题(希望能帮助到你们)

今天用RSA加解密时,当项目放到服务器上乱码问题

主要是解码后未指定编码字符集,导致乱码

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;

/**
 * RSA 加密
 * @author ZH
 *
 */
public class RSAEncrypt {

	private static String publicKey="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDdYAeZoU41pZrIR87tYElenpqRgLIA+MfuwgODYmhiTkaNXp03js4AU1NtDFoN1oY5GI4Pej2t6kbMMN8SCypanISTfZL81HXb1wYaC7Czfle+el82iBspWVgHYThBBoEewgHdok/TB+3X55Fr8EwBZFL35dt/SckrQBFTip0fQQIDAQAB";
	private static String privateKey="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN1gB5mhTjWlmshHzu1gSV6empGAsgD4x+7CA4NiaGJORo1enTeOzgBTU20MWg3WhjkYjg96Pa3qRsww3xILKlqchJN9kvzUddvXBhoLsLN+V756XzaIGylZWAdhOEEGgR7CAd2iT9MH7dfnkWvwTAFkUvfl239JyStAEVOKnR9BAgMBAAECgYEAiB8GTVc8agxcco6FFL1CICZSUOnbinFvLsaptl4KZXhQNZlZ/tGWpeiWwdT4gs3IVs9cevPlfU0zH1dlswiej1gnMuSo9UnT8LMq0nLiiAxnguLt4VQvlGECTk6/jOxH0gQEoChrA8MyOnAiVgzYdxaoCwaMtB9264Blbltuq+ECQQDxjLYB4DOY2XKnm2Pdh3CYnpQi0LGDY16Psbvqbj2D8a6FYR6EpmfvdhYXXhNU9Jp8uMETx/oEfALnDEzL/bsFAkEA6p5Zb/wo5iwkogJnN+zkbVsMeA1XvHT1XAyGvY8M3/pdXtOeHQtjW0+IxtTxuV+irRzNPETtalSyzV6H3RIgDQJATD79aMQrpVDmVy++qzvId/R+kCrODco9HCCfT5Wyx0Zvr1yDtJ2Oa1EcEg45DfUUGtB66dKTAf1fMS15xF54PQJBAMjcFj+8Rpt/0UDuA8YqRgmlOFCTQ7iw/Nn4U2Z30JL0OfmT/DprZH1o4vUum1+Tk6bXEJH3hLZSmt0df/1wpgUCQQDcKSWQpsLkGEAyL1q2X3mTSnpCd1N4zbTYwpORZfMgfPt4mRnmPEfjuolTUrZoMriJsG0ssrD4NcHbhRJXqX1j";
	public static void main(String[] args) throws Exception {
		//加密字符串
		String message = "中文测试,。;符号测试'\"";

		String messageEn = encrypt(message);
		System.out.println(message + "\t加密后的字符串为:" + messageEn);
		String messageDe = decrypt(messageEn);
		System.out.println("还原后的字符串为:" + messageDe);
	}


	/**
	 * RSA公钥加密
	 *
	 * @param str
	 *            加密字符串
	 * @param: publicKey
	 *            公钥
	 * @return 密文
	 * @throws Exception
	 *             加密过程中的异常信息
	 */
	public static String encrypt( String str) throws Exception{
		if(str == null){
			return "";
		}
		if(str.equals("")){
			return "";
		}
		//base64编码的公钥
		byte[] decoded = Base64.decodeBase64(publicKey);
		RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
		//RSA加密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, pubKey);
		String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
		return outStr;
	}

	/**
	 * RSA私钥解密
	 *
	 * @param str
	 *            加密字符串
	 * @param: privateKey
	 *            私钥
	 * @return 铭文
	 * @throws Exception
	 *             解密过程中的异常信息
	 */
	public static String decrypt(String str) throws Exception{
		if(str.equals("") || str ==null){
			return "";
		}
		//64位解码加密后的字符串
		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
		//base64编码的私钥
		byte[] decoded = Base64.decodeBase64(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
		//RSA解密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, priKey);
		String outStr = new String(cipher.doFinal(inputByte),"UTF-8");
		return outStr;
	}

new String(cipher.doFinal(inputByte),"UTF-8");
主要是解码的时候一定要指定字符集utf-8
new String(byte,charsetname)这个方法不指定字符集,编码就变得不确定了

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值