android rsa最大加密明文大小_Android 登录密码信息进行RSA加密示例
首先 有服务端生产一对公钥和私钥 我们在进行加密之前,先从服务器获取公钥,获取到公钥串之后,在对密码进行加密。
map.put("password", new String(Hex.encodeHex(RSAUtils.encryptByPublicKey(password,rsastr))));
此处,就是在登陆之前,对密码进行加密
password:登录密码 rsastr:从服务器获取的公钥串
Hex.encodeHex:对加密后的密码串进行编码,项目中需要集成相应的jar。
下面给出 RSAUtils的代码
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
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;
/**
*
* RSA公钥/私钥/签名工具包
*
*
* 罗纳德·李维斯特(Ron [R]ivest)、阿迪·萨莫尔(Adi [S]hamir)和伦纳德·阿德曼(Leonard [A]dleman)
*
*
* 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式
* 由于非对称加密速度极其缓慢,一般文件不使用它来加密而是使用对称加密,
* 非对称加密算法可以用来对对称加密的密钥加密,这样保证密钥的安全也就保证了数据的安全
*
*
* @author IceWee
* @version 1.0
* @date 2012-4-26
*/
public class RSAUtils {
/**
* 加密算法RSA
*/
public static final String KEY_ALGORITHM = "RSA";
/**
* 签名算法
*/
public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
/**
* 获取公钥的key
*/
private static final String PUBLIC_KEY = "RSAPublicKey";
/**
* 获取私钥的key
*/
private static final String PRIVATE_KEY = "RSAPrivateKey";
/**
* RSA最大加密明文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/**
* RSA最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/**
*
* 生成密钥对(公钥和私钥)
*
*
* @return
* @throws Exception
*/
public static Map genKeyPair() throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGen.initialize(1024);
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map keyMap = new HashMap(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);
return keyMap;
}
/**
*
* 用私钥对信息生成数字签名
*
*
* @param data 已加密数据
* @param privateKey 私钥(BASE64编码)
* @return
* @throws Exception
*/
public static String sign(byte[] data, String privateKey) throws Exception {
byte[] keyBytes = Base64Utils.decode(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateK);
signature.update(data);
return Base64Utils.encode(signature.sign());
}
/**
*
* 校验数字签名
*
*
*
* @param data 已加密数据
* @param publicKey 公钥(BASE64编码)
* @param sign 数字签名
* @return
* @throws Exception
*/
public static boolean verify(byte[] data, String publicKey, String sign)
throws Exception {
byte[] keyBytes = Base64Utils.decode(publicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicK = keyFactory.generatePublic(keySpec);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initVerify(publicK);
signature.update(data);
return signature.verify(Base64Utils.decode(sign));
}
/**
*
* 私钥解密
*
*
* @param encryptedData 已加密数据
* @param privateKey 私钥(BASE64编码)
* @return
* @throws Exception
*/
public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)
throws Exception {
byte[] keyBytes = Base64Utils.decode(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
// Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
}
/**
*
* 公钥解密
*
*
* @param encryptedData 已加密数据
* @param publicKey 公钥(BASE64编码)
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)
throws Exception {
byte[] keyBytes = Base64Utils.decode(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, publicK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return decryptedData;
}
/**
*
* 公钥加密
*
*
* @param sourcedata 源数据
* @param publicKey 公钥(BASE64编码)
* @return
* @throws Exception
*/
public static byte[] encryptByPublicKey(String sourcedata, String publicKey)
throws Exception {
byte[] data = sourcedata.getBytes();
byte[] keyBytes = Base64Utils.decode(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
// Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicK);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return encryptedData;
}
/**
*
* 私钥加密
*
*
* @param data 源数据
* @param privateKey 私钥(BASE64编码)
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data, String privateKey)
throws Exception {
byte[] keyBytes = Base64Utils.decode(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
// Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, privateK);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return encryptedData;
}
/**
*
* 获取私钥
*
*
* @param keyMap 密钥对
* @return
* @throws Exception
*/
public static String getPrivateKey(Map keyMap)
throws Exception {
Key key = (Key) keyMap.get(PRIVATE_KEY);
return Base64Utils.encode(key.getEncoded());
}
/**
*
* 获取公钥
*
*
* @param keyMap 密钥对
* @return
* @throws Exception
*/
public static String getPublicKey(Map keyMap)
throws Exception {
Key key = (Key) keyMap.get(PUBLIC_KEY);
return Base64Utils.encode(key.getEncoded());
}
// 把byte[]元素之间添加空格,并转化成字符串返回,
public static String byteToString(byte[] resouce){
StringBuffer sb = new StringBuffer();
for (int i = 0; i < resouce.length; i++) {
if (i == resouce.length-1) {
sb.append(Byte.toString(resouce[i]));
}else{
sb.append(Byte.toString(resouce[i]));
sb.append(" ");
}
}
return sb.toString();
}
// 把字符串按照空格进行拆分成数组,然后转化成byte[],返回
public static byte[] stringToByte(String resouce){
String[] strArr = resouce.split(" ");
int len = strArr.length;
byte[] clone = new byte[len];
for (int i = 0; i < len; i++) {
clone[i] = Byte.parseByte(strArr[i]);
}
return clone;
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
android rsa最大加密明文大小_Android 登录密码信息进行RSA加密示例相关推荐
- 随机验证码、用户登录密码验证、手机号加密案例
String类案例 1.随机数案例 package zrzy.qrs.stringequals;import java.util.Random;/** *需求:获取一个随机5位的验证码,包含字母大小写 ...
- 服务器的配置文件中的加密方式,配置文件中的密码有没有必要加密?
通常情况下,我们将类似数据库连接类的信息保存在配置文件中,java里面喜欢用properties文件,以前没有考虑过,将文件中的密码加密,现在领导要求必须加密,那么,有没有必要对密码进行加密?如果有人 ...
- 原创|RSA加密详解,京东登录页面都在用加密有什么好?
前言 在以前的一个项目中,觉得登录注册的加密方式不安全,需要改造一下,就用到了RSA加密.网上都说它是最安全的,现有的技术是无法破解的.我知道的京东的登录和国寿的登录都是用的这个加密.我想整理一下,肯 ...
- 登录密码加密,RSA加密算法
公钥加密,私钥解密 前端:密文RSA公钥加密,得到base64编码的加密密文,jsencrypt.min.js var publicKey = "MIGfMA0GCSqGSIb3DQEBAQ ...
- 用RSA实现Web单点登录密码的加密传输
在使用通用权限管理系统(吉日嘎拉)的单点登录功能时,对登录密码使用了RSA加密(非对称加密),有使用这个权限管理系统的可参考下. 前端部分,请引用以下几个js文件: <script type=& ...
- 新版正方教务系统模拟登录登录密码RSA加密破解
新版正方教务系统模拟登录登录密码RSA加密破解 最新版本教务系统,登录密码有被RSA加密,模拟登录时,我们需要先正方教务的加密方式. 第一步:获取到加密公钥 通过抓包我们可以获取到公钥获取url,然后 ...
- 新浪微博登录密码加密函数 wsse加密算法说明
// 新浪微博登录密码加密函数 // password 密码明文 // servertime 提交的参数之一 // nonce 提交的参数之一 // encode_password 输出 ...
- RSA密钥长度、明文长度和密文长度
RSA密钥长度.明文长度和密文长度 本文整理RSA加解密中必须考虑到的密钥长度.明文长度和密文长度问题知识,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,以后还会补充几篇RSA基础知识专 ...
- linux用户登录报密码不对,Linux用户登录密码的生成
一.从自动化需求说起 如何生成一个Linux用户登录密码?可能有人会说用passwd生成.的确,passwd命令能够帮助我们重置用户登录密码,但是这并没有解答如何生成一个Linux用户登录密码的疑问. ...
- mysql默认密码是多少_路由器192.168.1.1默认登录密码是多少?
打开路由器管理地址192.168.1.1弹出输入框需要输入密码,这个密码是多少呢?不同的路由器有着不同的默认密码. 关于192.168.1.1路由器密码: 1.首先,192.168.1.1登录口的默认 ...
最新文章
- Swift 注释规范和文档注释
- react如何通过shouldComponentUpdate来减少重复渲染
- codesys 简单案例_第一章:初识Codesys-1.4从一个示例程序讲起
- java communal_平台用英语怎么说
- python装饰器函数执行后日志_python 某一函数上面有多个装饰器
- 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”
- Linux Mint---开启桌面三维特效
- SQL将A库表的数据插入B库的某张表
- 微信小程序 腾讯云ocr 身份证识别
- ws2812 c语言程序,STC15单片机驱动WS2812B七彩LED(汇编混合编程)
- SI4438系列模块调试
- 入门月薪8k,3年年薪35w,大数据的就业前景与薪酬待遇浅析
- Thales Speakers Bureau:专家云集,将探讨量子技术、5G、数字身份、网络安全和人工智能
- 江在川上曰:云服务器上的flask项目部署(Ubuntu+Flask+Gunicorn+Supervisor+Nginx+Anaconda)
- 【React Native】使用react-native-wechat 进行微信好友、微信朋友圈进行分享
- TIA博途V17中如何创建和使用VoT应用程序_Web功能
- [Swift] 数组恒等 === 的 bug?!
- 自荐Mall4j项目一个基于spring boot的Java开源商城系统
- 计算机驱动空间不够,为何我的电脑在安装显卡驱动的时候就是安装不成功,提示是磁盘空间不足,但是其余的磁盘都有130GB左右...
- 芒芒分期换“套路”以VIP会员费收割用户,海尔金控旗下快捷通提供支付通道
热门文章
- C# 每天温习一点(IEnumerableTSource)
- NameValueCollection Dictionary区别
- perl--CGI编程之测试环境
- SqlServer Alwayson 搭建报错:19405
- 机器学习的几种主要学习方法
- NKOJ1472 警卫安排
- checkbox属性checked=checked已有,但却不显示打勾的解决办法
- 生成和解析二维码(zxing)
- 【转】谈一谈PHP字串清除空格函数不安全
- 【转】如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...