首先 有服务端生产一对公钥和私钥 我们在进行加密之前,先从服务器获取公钥,获取到公钥串之后,在对密码进行加密。

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加密示例相关推荐

  1. 随机验证码、用户登录密码验证、手机号加密案例

    String类案例 1.随机数案例 package zrzy.qrs.stringequals;import java.util.Random;/** *需求:获取一个随机5位的验证码,包含字母大小写 ...

  2. 服务器的配置文件中的加密方式,配置文件中的密码有没有必要加密?

    通常情况下,我们将类似数据库连接类的信息保存在配置文件中,java里面喜欢用properties文件,以前没有考虑过,将文件中的密码加密,现在领导要求必须加密,那么,有没有必要对密码进行加密?如果有人 ...

  3. 原创|RSA加密详解,京东登录页面都在用加密有什么好?

    前言 在以前的一个项目中,觉得登录注册的加密方式不安全,需要改造一下,就用到了RSA加密.网上都说它是最安全的,现有的技术是无法破解的.我知道的京东的登录和国寿的登录都是用的这个加密.我想整理一下,肯 ...

  4. 登录密码加密,RSA加密算法

    公钥加密,私钥解密 前端:密文RSA公钥加密,得到base64编码的加密密文,jsencrypt.min.js var publicKey = "MIGfMA0GCSqGSIb3DQEBAQ ...

  5. 用RSA实现Web单点登录密码的加密传输

    在使用通用权限管理系统(吉日嘎拉)的单点登录功能时,对登录密码使用了RSA加密(非对称加密),有使用这个权限管理系统的可参考下. 前端部分,请引用以下几个js文件: <script type=& ...

  6. 新版正方教务系统模拟登录登录密码RSA加密破解

    新版正方教务系统模拟登录登录密码RSA加密破解 最新版本教务系统,登录密码有被RSA加密,模拟登录时,我们需要先正方教务的加密方式. 第一步:获取到加密公钥 通过抓包我们可以获取到公钥获取url,然后 ...

  7. 新浪微博登录密码加密函数 wsse加密算法说明

    // 新浪微博登录密码加密函数 // password   密码明文 // servertime 提交的参数之一 // nonce      提交的参数之一 // encode_password 输出 ...

  8. RSA密钥长度、明文长度和密文长度

    RSA密钥长度.明文长度和密文长度 本文整理RSA加解密中必须考虑到的密钥长度.明文长度和密文长度问题知识,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,以后还会补充几篇RSA基础知识专 ...

  9. linux用户登录报密码不对,Linux用户登录密码的生成

    一.从自动化需求说起 如何生成一个Linux用户登录密码?可能有人会说用passwd生成.的确,passwd命令能够帮助我们重置用户登录密码,但是这并没有解答如何生成一个Linux用户登录密码的疑问. ...

  10. mysql默认密码是多少_路由器192.168.1.1默认登录密码是多少?

    打开路由器管理地址192.168.1.1弹出输入框需要输入密码,这个密码是多少呢?不同的路由器有着不同的默认密码. 关于192.168.1.1路由器密码: 1.首先,192.168.1.1登录口的默认 ...

最新文章

  1. Swift 注释规范和文档注释
  2. react如何通过shouldComponentUpdate来减少重复渲染
  3. codesys 简单案例_第一章:初识Codesys-1.4从一个示例程序讲起
  4. java communal_平台用英语怎么说
  5. python装饰器函数执行后日志_python 某一函数上面有多个装饰器
  6. 使用严苛模式打破Android4.0以上平台应用中UI主线程的“独断专行”
  7. Linux Mint---开启桌面三维特效
  8. SQL将A库表的数据插入B库的某张表
  9. 微信小程序 腾讯云ocr 身份证识别
  10. ws2812 c语言程序,STC15单片机驱动WS2812B七彩LED(汇编混合编程)
  11. SI4438系列模块调试
  12. 入门月薪8k,3年年薪35w,大数据的就业前景与薪酬待遇浅析
  13. Thales Speakers Bureau:专家云集,将探讨量子技术、5G、数字身份、网络安全和人工智能
  14. 江在川上曰:云服务器上的flask项目部署(Ubuntu+Flask+Gunicorn+Supervisor+Nginx+Anaconda)
  15. 【React Native】使用react-native-wechat 进行微信好友、微信朋友圈进行分享
  16. TIA博途V17中如何创建和使用VoT应用程序_Web功能
  17. [Swift] 数组恒等 === 的 bug?!
  18. 自荐Mall4j项目一个基于spring boot的Java开源商城系统
  19. 计算机驱动空间不够,为何我的电脑在安装显卡驱动的时候就是安装不成功,提示是磁盘空间不足,但是其余的磁盘都有130GB左右...
  20. 芒芒分期换“套路”以VIP会员费收割用户,海尔金控旗下快捷通提供支付通道

热门文章

  1. C# 每天温习一点(IEnumerableTSource)
  2. NameValueCollection Dictionary区别
  3. perl--CGI编程之测试环境
  4. SqlServer Alwayson 搭建报错:19405
  5. 机器学习的几种主要学习方法
  6. NKOJ1472 警卫安排
  7. checkbox属性checked=checked已有,但却不显示打勾的解决办法
  8. 生成和解析二维码(zxing)
  9. 【转】谈一谈PHP字串清除空格函数不安全
  10. 【转】如何解决:Android中 Error generating final archive: Debug Certificate expired on 10/09/18 16:30 的错误...