android rsa java_RSA算法 Android JAVA C#互通

1 packagecom.example.rsatest;2

3 importjava.io.UnsupportedEncodingException;4 importjava.math.BigInteger;5 importjava.security.KeyFactory;6 importjava.security.KeyPair;7 importjava.security.KeyPairGenerator;8 importjava.security.NoSuchAlgorithmException;9 importjava.security.PrivateKey;10 importjava.security.PublicKey;11 importjava.security.Signature;12 importjava.security.interfaces.RSAPrivateCrtKey;13 importjava.security.interfaces.RSAPublicKey;14 importjava.security.spec.RSAPrivateCrtKeySpec;15 importjava.security.spec.RSAPublicKeySpec;16 importjava.util.Date;17

18 importjavax.crypto.Cipher;19

20 public classRsaHelper21 {22 /**

23 * 生成RSA密钥对(默认密钥长度为1024)24 *25 *@return

26 */

27 public staticKeyPair generateRSAKeyPair()28 {29 return generateRSAKeyPair(1024);30 }31

32 /**

33 * 生成RSA密钥对34 *35 *@paramkeyLength 密钥长度,范围:512~204836 *@return

37 */

38 public static KeyPair generateRSAKeyPair(intkeyLength)39 {40 try

41 {42 KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA/ECB/PKCS1Padding");43 kpg.initialize(keyLength);44 returnkpg.genKeyPair();45 }46 catch(NoSuchAlgorithmException e)47 {48 return null;49 }50 }51

52 /*

53 * java端公钥转换成C#公钥54 */

55 public staticString encodePublicKeyToXml(PublicKey key)56 {57 if (!RSAPublicKey.class.isInstance(key))58 {59 return null;60 }61 RSAPublicKey pubKey =(RSAPublicKey) key;62 StringBuilder sb = newStringBuilder();63

64 sb.append("");65 sb.append("")66 .append(Base64Helper.encode(pubKey.getModulus().toByteArray()))67 .append("");68 sb.append("")69 .append(Base64Helper.encode(pubKey.getPublicExponent().toByteArray()))70 .append("");71 sb.append("");72 returnsb.toString();73 }74

75 /*

76 * C#端公钥转换成java公钥77 */

78 public staticPublicKey decodePublicKeyFromXml(String xml)79 {80 xml = xml.replaceAll("\r", "").replaceAll("\n", "");81 BigInteger modulus =

82 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,83 "", "")));84 BigInteger publicExponent =

85 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,86 "", "")));87

88 RSAPublicKeySpec rsaPubKey = newRSAPublicKeySpec(modulus, publicExponent);89

90 KeyFactory keyf;91 try

92 {93 keyf = KeyFactory.getInstance("RSA");94 returnkeyf.generatePublic(rsaPubKey);95 }96 catch(Exception e)97 {98 return null;99 }100 }101

102 /*

103 * C#端私钥转换成java私钥104 */

105 public staticPrivateKey decodePrivateKeyFromXml(String xml)106 {107 xml = xml.replaceAll("\r", "").replaceAll("\n", "");108 BigInteger modulus =

109 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,110 "", "")));111 BigInteger publicExponent =

112 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,113 "", "")));114 BigInteger privateExponent =

115 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml, "",116 "")));117 BigInteger primeP =

118 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml, "

",119 "

")));120 BigInteger primeQ =

121 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml, "",122 "")));123 BigInteger primeExponentP =

124 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,125 "", "")));126 BigInteger primeExponentQ =

127 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,128 "", "")));129 BigInteger crtCoefficient =

130 new BigInteger(1, Base64Helper.decode(StringUtils.getMiddleString(xml,131 "", "")));132

133 RSAPrivateCrtKeySpec rsaPriKey =

134 newRSAPrivateCrtKeySpec(modulus, publicExponent, privateExponent, primeP,135 primeQ, primeExponentP, primeExponentQ, crtCoefficient);136

137 KeyFactory keyf;138 try

139 {140 keyf = KeyFactory.getInstance("RSA");141 returnkeyf.generatePrivate(rsaPriKey);142 }143 catch(Exception e)144 {145 return null;146 }147 }148

149 /*

150 * java端私钥转换成C#私钥151 */

152 public staticString encodePrivateKeyToXml(PrivateKey key)153 {154 if (!RSAPrivateCrtKey.class.isInstance(key))155 {156 return null;157 }158 RSAPrivateCrtKey priKey =(RSAPrivateCrtKey) key;159 StringBuilder sb = newStringBuilder();160

161 sb.append("");162 sb.append("")163 .append(Base64Helper.encode(priKey.getModulus().toByteArray()))164 .append("");165 sb.append("")166 .append(Base64Helper.encode(priKey.getPublicExponent().toByteArray()))167 .append("");168 sb.append("

").append(Base64Helper.encode(priKey.getPrimeP().toByteArray()))169 .append("

");170 sb.append(" ").append(Base64Helper.encode(priKey.getPrimeQ().toByteArray()))171 .append("");172 sb.append("")173 .append(Base64Helper.encode(priKey.getPrimeExponentP().toByteArray()))174 .append("");175 sb.append("")176 .append(Base64Helper.encode(priKey.getPrimeExponentQ().toByteArray()))177 .append("");178 sb.append("")179 .append(Base64Helper.encode(priKey.getCrtCoefficient().toByteArray()))180 .append("");181 sb.append("")182 .append(Base64Helper.encode(priKey.getPrivateExponent().toByteArray()))183 .append("");184 sb.append("");185 returnsb.toString();186 }187

188 //用公钥加密

189 public static byte[] encryptData(byte[] data, PublicKey pubKey)190 {191 try

192 {193 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");194 cipher.init(Cipher.ENCRYPT_MODE, pubKey);195 returncipher.doFinal(data);196 }197 catch(Exception e)198 {199 return null;200 }201 }202

203 //用私钥解密

204 public static byte[] decryptData(byte[] encryptedData, PrivateKey priKey)205 {206 try

207 {208 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");209 cipher.init(Cipher.DECRYPT_MODE, priKey);210 returncipher.doFinal(encryptedData);211 }212 catch(Exception e)213 {214 return null;215 }216 }217

218 /**

219 * 根据指定公钥进行明文加密220 *221 *@paramplainText 要加密的明文数据222 *@parampubKey 公钥223 *@return

224 */

225 public staticString encryptDataFromStr(String plainText, PublicKey pubKey)226 {227

228 try

229 {230 byte[] dataByteArray = plainText.getBytes("UTF-8");231 byte[] encryptedDataByteArray =RsaHelper.encryptData(dataByteArray, pubKey);232 returnBase64Helper.encode(encryptedDataByteArray);233 }234 catch(UnsupportedEncodingException e)235 {236 //TODO Auto-generated catch block

237 e.printStackTrace();238 return "";239 }240 }241

242 /**

243 * 根据指定私钥对数据进行签名(默认签名算法为"SHA1withRSA")244 *245 *@paramdata 要签名的数据246 *@parampriKey 私钥247 *@return

248 */

249 public static byte[] signData(byte[] data, PrivateKey priKey)250 {251 return signData(data, priKey, "SHA1withRSA");252 }253

254 /**

255 * 根据指定私钥和算法对数据进行签名256 *257 *@paramdata 要签名的数据258 *@parampriKey 私钥259 *@paramalgorithm 签名算法260 *@return

261 */

262 public static byte[] signData(byte[] data, PrivateKey priKey, String algorithm)263 {264 try

265 {266 Signature signature =Signature.getInstance(algorithm);267 signature.initSign(priKey);268 signature.update(data);269 returnsignature.sign();270 }271 catch(Exception ex)272 {273 return null;274 }275 }276

277 /**

278 * 用指定的公钥进行签名验证(默认签名算法为"SHA1withRSA")279 *280 *@paramdata 数据281 *@paramsign 签名结果282 *@parampubKey 公钥283 *@return

284 */

285 public static boolean verifySign(byte[] data, byte[] sign, PublicKey pubKey)286 {287 return verifySign(data, sign, pubKey, "SHA1withRSA");288 }289

290 /**

291 *@paramdata 数据292 *@paramsign 签名结果293 *@parampubKey 公钥294 *@paramalgorithm 签名算法295 *@return

296 */

297 public static boolean verifySign(byte[] data, byte[] sign, PublicKey pubKey,298 String algorithm)299 {300 try

301 {302 Signature signature =Signature.getInstance(algorithm);303 signature.initVerify(pubKey);304 signature.update(data);305 returnsignature.verify(sign);306 }307 catch(Exception ex)308 {309 return false;310 }311 }312

313 public static voidmain(String[] args)314 {315 KeyPair kp =RsaHelper.generateRSAKeyPair();316 PublicKey pubKey =kp.getPublic();317 PrivateKey priKey =kp.getPrivate();318

319 String pubKeyXml =RsaHelper.encodePublicKeyToXml(pubKey);320 String priKeyXml =RsaHelper.encodePrivateKeyToXml(priKey);321 System.out.println("====公钥====");322 System.out.println(pubKeyXml);323 System.out.println("====私钥====");324 System.out.println(priKeyXml);325

326 PublicKey pubKey2 =RsaHelper.decodePublicKeyFromXml(pubKeyXml);327 PrivateKey priKey2 =RsaHelper.decodePrivateKeyFromXml(priKeyXml);328

329 System.out.println("====公钥对比====");330 System.out.println(pubKey.toString());331 System.out.println("------");332 System.out.println(pubKey2.toString());333

334 System.out.println("====私钥对比====");335 System.out.println(priKey.toString());336 System.out.println("------");337 System.out.println(priKey2.toString());338

339 try

340 {341 String pubKeyXml3 =

342 "rHESyuI3ny4MLsqDBalW9ySaodCL0e6Bsrl01Q5G1qm2wjUoGULazZSNqZY+JQNjU92tW3Snk5RPIkv+wDj+uOT9LTUjQImltHnzqMvbt06GipVXDOyBLTa7G/zRIe/CrjyJ+XEYX2xIhpe5ayowl3HHUpZ71jRNioyxaVVZ8S0=AQAB";343 String priKeyXml3 =

344 "rHESyuI3ny4MLsqDBalW9ySaodCL0e6Bsrl01Q5G1qm2wjUoGULazZSNqZY+JQNjU92tW3Snk5RPIkv+wDj+uOT9LTUjQImltHnzqMvbt06GipVXDOyBLTa7G/zRIe/CrjyJ+XEYX2xIhpe5ayowl3HHUpZ71jRNioyxaVVZ8S0=AQAB

5a7uM+IeY8QMVQl0q88ZTqWbB555l7+366cUIClTN8z2ZXzTnWFCNoQzUrG14FouJFYumFZD12Ni5MkJK6gqSw==

wDMhwwO4kz82uSG+FlCBr06fYk2COTg0TofmSp/5OrVqgkBIe7FgpTpVGzGLk0mvOLcy6UZftq//W0Saow6nZw==FbjDgliiMyE5YVlxlUYSyKNU1BWivj09caXte1UtL5vMubBiewHVtz4tdGamIr+kmX8lDPcrl1Uo5yY0HdLbnQ==kIjjJsgxkWnEOUyKqjU4kSDK8x3ehDEkBLpmEFBlGCU9R14YJAyr5RUM0zpbABQ1VK1P9+UYLUYE/hmFQIHQmQ==pxQDThwSnUZ4EaNaCPl1ovYypdQUZaZ/Sld1+0n8FEjkmRcGP1R9VMuj1ViPZg3rvm2GeP8Xv1SJqJUVueWiGA==DxBNoPWEAF7IZ6n/KhZx52MGMw6BuFQKdm9m+lml7Iik03BLUXGapYzNlzvtr9QM8D2UMEIPhX/WLdvPpEEWVzGnD7XpLXjGwfu1ZkJRcXPEZEZ2subh5ZBqOWCFWKv5WwgGYWuYDLHfrBlBgSFWR8cZuyqkmMsWl4CiadXqGA0=";345

346 System.out.println((new Date()).toLocaleString() + ": 加载公钥中。。。");347 PublicKey pubKey3 =RsaHelper.decodePublicKeyFromXml(pubKeyXml3);348 System.out.println((new Date()).toLocaleString() + ": 加载私钥中。。。");349 PrivateKey priKey3 =RsaHelper.decodePrivateKeyFromXml(priKeyXml3);350

351 String dataStr = "Java与.NET和平共处万岁!";352 byte[] dataByteArray = dataStr.getBytes("utf-8");353 System.out.println("data的Base64表示:" +Base64Helper.encode(dataByteArray));354

355 System.out.println((new Date()).toLocaleString() + ": 加密中。。。"); //加密

356 byte[] encryptedDataByteArray =RsaHelper.encryptData(dataByteArray, pubKey3);357

358 System.out.println("encryptedData的Base64表示:"

359 +Base64Helper.encode(encryptedDataByteArray));360 System.out.println((new Date()).toLocaleString() + ": 解密中。。。"); //解密361 //byte[]

362 byte[] decryptedDataByteArray =

363 RsaHelper.decryptData(encryptedDataByteArray, priKey3);364 System.out.println(new String(decryptedDataByteArray, "utf-8"));//签名

365 System.out.println((new Date()).toLocaleString() + ": 签名中。。。");366 byte[] signDataByteArray =RsaHelper.signData(dataByteArray, priKey3);367 System.out.println("signData的Base64表示:"

368 + Base64Helper.encode(signDataByteArray)); //验签

369 System.out.println((new Date()).toLocaleString() + ": 验签中。。。");370 boolean isMatch =

371 RsaHelper.verifySign(dataByteArray, signDataByteArray, pubKey3);372 System.out.println("验签结果:" +isMatch);373

374 }375 catch(Exception ex)376 {377 ex.printStackTrace();378 }379 }380 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值