package com.wm.remusic.net; import android.support.annotation.NonNull; import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.security.KeyFactory; import java.security.interfaces.RSAPublicKey; import java.security.spec.RSAPublicKeySpec; import java.util.HashMap; /** * Created by wm on 2016/4/13. */ public class RsaCal { public static String reverse(String str) { return new StringBuilder(str).reverse().toString(); } public static String rsaEncode(String key) { String pubKey = "010001"; String m = "157794750267131502212476817800345498121872783333389747424011531025366277535262539913701806290766479189477533597854989606803194253978660329941980786072432806427833685472618792592200595694346872951301770580765135349259590167490536138082469680638514416594216629258349130257685001248172188325316586707301643237607"; try { String k = reverse(key); String keyTo16 = toHex(k, "GBK"); // System.out.println(new BigInteger(keyTo16, 16)); // new BigInteger(keyTo16, 16) 字符串转为16进制数字, // pow(Integer.valueOf(pubKey, 16)) 得到次方的值 //remainder 取余数 String c = (new BigInteger(keyTo16, 16).pow(Integer.valueOf(pubKey, 16))).remainder(new BigInteger(m)) + ""; //转为16进制表示 return (new BigInteger(c).toString(16)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return "-1"; } public static void main3(String[] args) { String key = "7b104953fb112826"; String pubKey = "010001"; String m = "157794750267131502212476817800345498121872783333389747424011531025366277535262539913701806290766479189477533597854989606803194253978660329941980786072432806427833685472618792592200595694346872951301770580765135349259590167490536138082469680638514416594216629258349130257685001248172188325316586707301643237607"; try { String k = reverse(key); String keyTo16 = toHex(k, "GBK"); // System.out.println(new BigInteger(keyTo16, 16)); // new BigInteger(keyTo16, 16) 字符串转为16进制数字, // pow(Integer.valueOf(pubKey, 16)) 得到次方的值 //remainder 取余数 String c = (new BigInteger(keyTo16, 16).pow(Integer.valueOf(pubKey, 16))).remainder(new BigInteger(m)) + ""; //转为16进制表示 System.out.println(new BigInteger(c).toString(16)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } @NonNull static public String toHex(String text, String enc) throws UnsupportedEncodingException { byte B[] = text.getBytes(enc); StringBuilder buf = new StringBuilder(); for (byte b : B) { buf.append(Integer.toHexString(b & 0xff)); } return buf.toString(); } public static void main1(String[] args) throws Exception { // TODO Auto-generated method stub HashMap<String, Object> map = RSAUtils.getKeys(); //生成公钥和私钥 // RSAPublicKey publicKey = (RSAPublicKey) map.get("public"); // RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private"); String big1 = "00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7"; String big2 = "010001"; // System.out.println(b1.toString()); // System.out.println(b2.toString()); RSAPublicKeySpec rsaPubKS = new RSAPublicKeySpec(new BigInteger(big1, 16), new BigInteger(big2, 16)); KeyFactory kf = KeyFactory.getInstance("RSA"); RSAPublicKey publicKey = (RSAPublicKey) kf.generatePublic(rsaPubKS); //模 String modulus = publicKey.getModulus().toString(); //公钥指数 String public_exponent = publicKey.getPublicExponent().toString(); System.err.println(modulus); System.err.println(public_exponent); //私钥指数 // String private_exponent = privateKey.getPrivateExponent().toString(); //明文 String ming = "628211bf359401b7"; //使用模和指数生成公钥和私钥 RSAPublicKey pubKey = RSAUtils.getPublicKey(new BigInteger(big1, 16) + "", new BigInteger(big2, 16) + ""); // RSAPrivateKey priKey = RSAUtils.getPrivateKey(modulus, private_exponent); //加密后的密文 String mi = RSAUtils.encryptByPublicKey(ming, pubKey); System.err.println(mi); //解密后的明文 // ming = RSAUtils.decryptByPrivateKey(mi, priKey); // System.err.println(ming); } }