最近在做一个J2ME项目,需要用到RSA加解密,查询很多资料,最终找到“Bouncy Castle”才解决问题。
一.约束&思路:
1)RSA算法本身就是有长度限制的,1024位的RSA最多能加密长117字节的分组数据。
2)Bouncy Castle提供四种RSA的加密编码,如下:
RSA/NONE/NoPadding (支持到128个字符)
RSA/NONE/PKCS1Padding (支持到107个字符)
RSA/NONE/OAEPPadding (支持到86个字符)
RSA/NONE/ISO9796-1Padding
3)由于传输的数据大于117个字节,所以采用分组加解密的方法解决此问题,及把传输的数据分成N个117个字节后再传输。
4)代码:采用编码:RSA/NONE/PKCS1Padding
/*
* @param plainText 加密字符串
* @param key 公钥
* @return
* @throws InvalidCipherTextException
*/
public static byte[] encrypt(String plainText, CipherParameters key) throws InvalidCipherTextException {
byte[] data = plainText.getBytes();
RSAEngine baseEngine = new RSAEngine();
PKCS1Encoding engine = new PKCS1Encoding(baseEngine);
engine.init(true, key);
int inputBlockSize = engine.getInputBlockSize();
int input_numWholeBlocks = data.length / inputBlockSize;
int input_sizeLastBlock = data.length % inputBlockSize;
int input_numBlocks;
if (input_sizeLastBlock > 0) {
input_numBlocks = input_numWholeBlocks + 1;
} else {
input_numBlocks = input_numWholeBlocks;
}
int outPutBlockSize = engine.getOutputBlockSize();
byte[] ciphertext = new byte[input_numBlocks * outPutBlockSize];
byte[] aux;
for (int i = 0; i < input_numWholeBlocks; i++) {
aux = engine.processBlock(data, i * inputBlockSize, inputBlockSize);
System.arraycopy(aux, 0, ciphertext, i * outPutBlockSize, aux.length);
}
int WN = input_numBlocks - input_numWholeBlocks;
if(WN==1){
aux = engine.processBlock(data, input_numWholeBlocks * inputBlockSize, input_sizeLastBlock);
System.arraycopy(aux, 0, ciphertext, input_numWholeBlocks * outPutBlockSize, aux.length);
}
return ciphertext;
}
/**
*
* 分组解密
* @param data 解密数据
* @param key 私钥
* @return
* @throws InvalidCipherTextException
*/
public static String decrypt(byte[] data, CipherParameters key) throws InvalidCipherTextException {
RSAEngine baseEngine = new RSAEngine();
PKCS1Encoding engine = new PKCS1Encoding(baseEngine);
engine.init(false, key);
int inputBlockSize = engine.getInputBlockSize();
int input_numWholeBlocks = data.length / inputBlockSize;
int outPutBlockSize = engine.getOutputBlockSize();
byte[] ciphertext = new byte[input_numWholeBlocks * outPutBlockSize];
byte[] aux;
for (int i = 0; i < input_numWholeBlocks; i++) {
try {
aux = engine.processBlock(data, i * inputBlockSize, inputBlockSize);
System.arraycopy(aux, 0, ciphertext, i * outPutBlockSize, aux.length);
} catch (Exception e) {
break;
}
}
return new String(ciphertext).trim();
}
分享到:
相关推荐
RSA加密 Java钥转C#用到. 格式转换要用到一个开源加密库Bouncy Castle Crypto APIs
org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包org.bouncycastle--j2me加密包
java借助bouncycastle库实现ECC双向加密解密算法Utils工具包。
* RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥...
C# 基于BouncyCastle.Crypto 1.8.10 实现国密算法,SM2,SM3,SM4(加签解签,加密解密)
Python兼容Java bouncycastle包的国密sm2加解密方法
主要介绍了C# RSA分段加解密实现方法,结合具体实例形式分析了C# RSA加密解密的原理与具体实现技巧,需要的朋友可以参考下
c# AES加密与解密,RSA加密与解密,BouncyCastle.Crypto加密与解密,适用于接口的加密与解密
RSA加密算法实现以及C#与java互通加解密,解决RSA算法在java与C#相互通用
C# RSA加密、支持JAVA格式公钥私钥
java加密解密研究2、Bouncy Castle和Commons Codec加密组件 java加密解密研究2、Bouncy Castle和Commons Codec加密组件
如果我们要用的某种算法,Java标准库没有提供怎么办?BouncyCastle就是一个提供了很多哈希算法和加密算法的第三方库。它提供了Java标准库没有的一些算法,例如,RipeMD160哈希算法。
BouncyCastle 加密算法.net组件 版本10.0
Bouncy Castle Crypto.dll是一个C#实现的加密包。一款加解密的工具类,可以在C#程序中添加依赖项。
使用C# 版本 BouncyCastle 包 ,实现带原文数据PKCS#7 签名。 此版本请不要下载,只包含签名部分。
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973
asp.net RSA 私钥加密公钥解密 能解 php Java 实现RSA加密互通 ,PKCS#8 格式的的密钥文件 ,公钥解密 依赖于BouncyCastle.Crypto.dll
C# BouncyCastle.Crypto.dll用于SM4、SM2加密
通常C#使用xml格式的密钥文件,不能使用Linux下的公钥和私钥pem文件。...本源码直接使用linux下的PEM文件来做RSA加密和解密,可避免xml格式文件的移植性问题。完整的源码,Vs2008工程,以编译和测试通过。
C#项目,可以直接运行,根据BouncyCastle,sm3、sm4,ECB、CBC加密解密