java rsa_java中RSA加解密的实现

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

HashMap map = RSAUtils.getKeys();

//生成公钥和私钥

RSAPublicKey publicKey = (RSAPublicKey) map.get("public");

RSAPrivateKey privateKey = (RSAPrivateKey) map.get("private");

//模

String modulus = publicKey.getModulus().toString();

//公钥指数

String public_exponent = publicKey.getPublicExponent().toString();

//私钥指数

String private_exponent = privateKey.getPrivateExponent().toString();

//明文

String ming = "123456789";

//使用模和指数生成公钥和私钥

RSAPublicKey pubKey = RSAUtils.getPublicKey(modulus, public_exponent);

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);

}

package yyy.test.rsa;

import java.math.BigInteger;

import java.security.KeyFactory;

import java.security.KeyPair;

import java.security.KeyPairGenerator;

import java.security.NoSuchAlgorithmException;

import java.security.interfaces.RSAPrivateKey;

import java.security.interfaces.RSAPublicKey;

import java.security.spec.RSAPrivateKeySpec;

import java.security.spec.RSAPublicKeySpec;

import java.util.HashMap;

import javax.crypto.Cipher;

public class RSAUtils {

/**

* 生成公钥和私钥

* @throws NoSuchAlgorithmException

*

*/

public static HashMap getKeys() throws NoSuchAlgorithmException{

HashMap map = new HashMap();

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");

keyPairGen.initialize(1024);

KeyPair keyPair = keyPairGen.generateKeyPair();

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

map.put("public", publicKey);

map.put("private", privateKey);

return map;

}

/**

* 使用模和指数生成RSA公钥

* 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA

* /None/NoPadding】

*

* @param modulus

* 模

* @param exponent

* 指数

* @return

*/

public static RSAPublicKey getPublicKey(String modulus, String exponent) {

try {

BigInteger b1 = new BigInteger(modulus);

BigInteger b2 = new BigInteger(exponent);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);

return (RSAPublicKey) keyFactory.generatePublic(keySpec);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* 使用模和指数生成RSA私钥

* 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA

* /None/NoPadding】

*

* @param modulus

* 模

* @param exponent

* 指数

* @return

*/

public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {

try {

BigInteger b1 = new BigInteger(modulus);

BigInteger b2 = new BigInteger(exponent);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);

return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* 公钥加密

*

* @param data

* @param publicKey

* @return

* @throws Exception

*/

public static String encryptByPublicKey(String data, RSAPublicKey publicKey)

throws Exception {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

// 模长

int key_len = publicKey.getModulus().bitLength() / 8;

// 加密数据长度 <= 模长-11

String[] datas = splitString(data, key_len - 11);

String mi = "";

//如果明文长度大于模长-11则要分组加密

for (String s : datas) {

mi += bcd2Str(cipher.doFinal(s.getBytes()));

}

return mi;

}

/**

* 私钥解密

*

* @param data

* @param privateKey

* @return

* @throws Exception

*/

public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey)

throws Exception {

Cipher cipher = Cipher.getInstance("RSA");

cipher.init(Cipher.DECRYPT_MODE, privateKey);

//模长

int key_len = privateKey.getModulus().bitLength() / 8;

byte[] bytes = data.getBytes();

byte[] bcd = ASCII_To_BCD(bytes, bytes.length);

System.err.println(bcd.length);

//如果密文长度大于模长则要分组解密

String ming = "";

byte[][] arrays = splitArray(bcd, key_len);

for(byte[] arr : arrays){

ming += new String(cipher.doFinal(arr));

}

return ming;

}

/**

* ASCII码转BCD码

*

*/

public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {

byte[] bcd = new byte[asc_len / 2];

int j = 0;

for (int i = 0; i < (asc_len + 1) / 2; i++) {

bcd[i] = asc_to_bcd(ascii[j++]);

bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));

}

return bcd;

}

public static byte asc_to_bcd(byte asc) {

byte bcd;

if ((asc >= '0') && (asc <= '9'))

bcd = (byte) (asc - '0');

else if ((asc >= 'A') && (asc <= 'F'))

bcd = (byte) (asc - 'A' + 10);

else if ((asc >= 'a') && (asc <= 'f'))

bcd = (byte) (asc - 'a' + 10);

else

bcd = (byte) (asc - 48);

return bcd;

}

/**

* BCD转字符串

*/

public static String bcd2Str(byte[] bytes) {

char temp[] = new char[bytes.length * 2], val;

for (int i = 0; i < bytes.length; i++) {

val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);

temp[i * 2] = (char) (val > 9 ? val + 'A' - 10 : val + '0');

val = (char) (bytes[i] & 0x0f);

temp[i * 2 + 1] = (char) (val > 9 ? val + 'A' - 10 : val + '0');

}

return new String(temp);

}

/**

* 拆分字符串

*/

public static String[] splitString(String string, int len) {

int x = string.length() / len;

int y = string.length() % len;

int z = 0;

if (y != 0) {

z = 1;

}

String[] strings = new String[x + z];

String str = "";

for (int i=0; i

if (i==x+z-1 && y!=0) {

str = string.substring(i*len, i*len+y);

}else{

str = string.substring(i*len, i*len+len);

}

strings[i] = str;

}

return strings;

}

/**

*拆分数组

*/

public static byte[][] splitArray(byte[] data,int len){

int x = data.length / len;

int y = data.length % len;

int z = 0;

if(y!=0){

z = 1;

}

byte[][] arrays = new byte[x+z][];

byte[] arr;

for(int i=0; i

arr = new byte[len];

if(i==x+z-1 && y!=0){

System.arraycopy(data, i*len, arr, 0, y);

}else{

System.arraycopy(data, i*len, arr, 0, len);

}

arrays[i] = arr;

}

return arrays;

}

}

java

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

android

Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");

参考:

http://stackoverflow.com/questions/6069369/rsa-encryption-difference-between-java-and-android

http://stackoverflow.com/questions/2956647/rsa-encrypt-with-base64-encoded-public-key-in-android

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python字典统计_python字典计数

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01;字典?thcollections.counter 计数器? image.png找不到键的时候会调用miss方法如果键不是字符串&#xff0c…

java相册_精致小巧的java相册制作方法

本文实例为大家分享了java相册制作方法&#xff0c;供大家参考&#xff0c;具体内容如下注&#xff1a;1)html上的图片是静态指定的。当更新了新的图片时必须手工更新。所以使用Servlet读取本地images中的所有图片&#xff0c;动态显示给用户。2)如果存在中文名的图片&#xff…

python时间差转换成天数_Python实现计算两个时间之间相差天数的方法

本文实例讲述了Python实现计算两个时间之间相差天数的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a; #-*- encoding:UTF-8 -*- from datetime import date import time nowtime date.today() def convertstringtodate(stringtime): "把字符串类型转换为da…

java break的用法_Java基础break、continue语句的用法

break适用范围&#xff1a;只能用于switch或者是循环语句中。当然可以用于增强for循环。break作用&#xff1a;1. break用于switch语句的作用是结束一个switch语句。2. break用于循环语句中的作用是结束当前所在的循环语句。break和continue区别:break是结束循环&#xff0c;进…

利用python画分形图_使用 Python 绘制 Mandelbrot 分形图

以前收集的关于Mandelbrot分形图的Python脚本&#xff0c;Mandelbrot集合的图像因它洛可可式繁复卷曲华丽的风格而受到大众的欣赏和赞叹&#xff0c;与其他分形图案一起&#xff0c;是许多艺术家和设计师的灵感来源。 是由于今天个人电脑计算能力的强大&#xff0c;才有可能让我…

java ucs2转utf8_Windows下Unicode(UCS2),UTF8,GBK(GB2312)互转

Windows下提供了两个编码转换函数&#xff1a;WideCharToMultiByte和MultiByteToWideChar。用它们可实现Unicode(UCS2)&#xff0c;UTF8&#xff0c;GBK(GB2312)互转。这两个函数的原型是&#xff1a;intWINAPIMultiByteToWideChar(__in UINT CodePage,__in DWORD dwFlags,__in…

彻底搞懂 python 中文乱码问题_彻底搞懂 Python 编码 - sylan215的软件测试技术学习 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...

因为中文的特殊编码&#xff0c;导致 Python2 和 Python3 使用过程中的各种编码问题&#xff0c;如果不清楚其中的关联关系&#xff0c;那么这就一直是个大坑&#xff0c;不是懵逼就还是懵逼&#xff0c;所以就目前碰到的情况彻底梳理下 Python2 和 Python3 中编码的关系和区别…

java sound api_Java Sound API

Java Sound API是javaSE平台提供底层的(low-level)处理声音接口。例外&#xff0c;java也提供了简单的实用的高层媒体接口(higher-level) &#xff0d; JMF(Java Media Framework)。Java Sound API 将需要处理的数字音频分为&#xff1a;simpled-audio和midi,分别提供Package来…

取pi的前8位的解压密码_两种方式实现取16位变量的高低8位, 不严谨对比

程序如下&#xff0c;第一种方式是强制指针转换&#xff0c;再取结构体成员&#xff1b;第二种方式是简单的移位。前面这种写法得考虑大小端序, 后者不用管.#include <stdio.h>#define hi8(x) ((( struct { unsigned char l; unsigned char h; } *)(&x))->h) …

java实现的小程序_Java实现 微信小程序 + 消息推送

实现效果&#xff1a;下面要显示五个字段接下来&#xff0c;参照官方文档&#xff0c;一步步实现&#xff1a;一、官方给出请求示例、返回示例二、根据上面编写实体类(1)请求参数Datapublic class SendTemplateReq {/*** 接收者(用户)的 openid*/private String touser;/*** 所…

vb excel 整行删除_Excel中常用的批量处理都不掌握,那就真的Out了

针对一些有规律&#xff0c;能批量处理的数据&#xff0c;必须采用批量处理的方法&#xff0c;否则对于工作效率就会有很大的影响。今天我们来学习的内容是Excel中的6个批量处理技巧。一、Excel批量技巧&#xff1a;批量求和。目的&#xff1a;按照“季度”和“产品”两个维度计…

eclipse找不到dynamic_Eclipse Juno在Dynamic Web Project中没有JSP(但其他...

简短的问题是,在创建动态Web项目(1.6 jdk)时,我可以看到要创建的所有文件类型,但jsp没有选项.当我检查文件关联时添加到那里,没有可供选择的JSP编辑器.稍微长一点的版本是我只想编辑JSP文件,我安装了Juno EE版本,它说安装了Web工具平台,一切正常.然而,虽然一切正常,但文件关联中…

exe编辑器_【小功能】Unreal Editor中调用exe

后续文章更新移步→微信公众号“虚幻社区”&#xff08;mantra-xhsq&#xff09;&#xff0c;您的支持是我创作的动力。在程序界混&#xff0c;哪能碰上不改需求的策划 --Mantra最近遇到了一个奇葩的需求&#xff0c;在Unreal Editor的Toolbar中添加一个快捷键&#xff0c;可以…

java bitset用途_BitSet的用法

1&#xff0c;BitSet类大小可动态改变, 取值为true或false的位集合。用于表示一组布尔标志。此类实现了一个按需增长的位向量。位 set 的每个组件都有一个 boolean 值。用非负的整数将 BitSet 的位编入索引。可以对每个编入索引的位进行测试、设置或者清除。通过逻辑与、逻辑或…

html select选择事件_按键精灵的Html系列命令实战讲解

金猪脚本(原飞猪脚本)以按键精灵教学为主,涉及UiBot&#xff0c;Python,Lua等脚本编程语言,教学包括全自动办公脚本,游戏辅助脚本,引流脚本,网页脚本,安卓脚本,IOS脚本,注册脚本,点赞脚本,阅读脚本以及网赚脚本等各个领域。想学习按键精灵的朋友可以添加金猪脚本粉丝交流群:554…

java多线程意义_Java多线程学习之多线程的概念及意义

Java的线程机制&#xff0c;则是由执行程序表示的单一进程创建的任务(拗口&#xff01;)&#xff0c;注意&#xff0c;是在单一进程里面创建多个任务&#xff0c;不同于操作系统分叉外部进程。由于所有的任务在同一个进程内&#xff0c;任务之间会相互干涉(例如操作同样的对象&…

java 验证码_java学习之web基础(6):使用Response的输出流在页面输出验证码

package 输出并且我们可以写一个简单的网页&#xff0c;来实现点击更新验证码<!DOCTYPE html>

java socket编程实现聊天程序_java Socket编程 聊天程序 服务器端和客户端

[java]代码库package com.gufengxiachen.sthreadchatapp;/*** author GUXIA*/import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;imp…

电商前台模板中文html5_跨境电商平台上产品如何上传?虾皮新版批量上传工具使用指南分享...

大家好&#xff0c;这里是天师跨境&#xff0c;今天来为电商新人们解答一下关于如何在跨境电商平台上上传产品的疑惑&#xff0c;顺便介绍一下虾皮跨境平台的新版批量上传工具是如何使用的。在跨境电商平台上开店的新手们在入驻成功后&#xff0c;一般最先面临的问题就是上传产…

移动端 关闭浏览器事件_前端开发中什么是移动端点透事件?

点透事件&#xff1a;是指两个元素其中一个元素具有默认的点击事件&#xff0c;当我们让不具有点击事件的元素隐藏起来&#xff0c;会触发另一个元素的点击事件&#xff0c;这种行为被称之为点透事件。如下图所示&#xff1a;当我们给div元素添加touchstart事件让div元素隐藏起…