首页 > 编程知识 正文

javarsa分段加密,加密算法有哪些

时间:2023-05-05 14:11:17 阅读:156168 作者:1504

我打算为spark插件加密对话消息写这个类。

RSA的Java实现无法一次加密大字符。 我试着自己处理了一下。 请参阅以下代码:

Base64代码类为publicdomainbase 64 for Java//I harder.source forge.net/current/Java/base 64 /

我不会详细讨论的简单实现,例如将的公钥存储在文件中,但是让我们来看看代码。

=========================================================================================

输入Java.security.*;

import Java.security.spec.pkcs8 encodedkeyspec;

import Java.security.spec.x509 encodedkeyspec;

import java.util.HashMap;

import java.util.Map;

import javax.crypto.*;

import java.io.*;

public class Encryptor {

privatestaticfinalstringkey _ filename=' c :\ mykey.dat ';

privatestaticfinalstringothers _ key _ filename=' c :\ others key.dat ';

//privatestaticfinalintkey _ size=1024;

//privatestaticfinalintblock _ size=117;

//privatestaticfinalintoutput _ block _ size=128;

privatestaticfinalintkey _ size=2048; //RSA key是多少位

privatestaticfinalintblock _ size=245;//单个RSA加密操作允许的长度

//该值与KEY_SIZE已经对方法进行padding有关。 因为1024的key输出为128,2048 key的输出为256字节

//11字节可能用于存储padding信息,因此最多只能使用245字节。

privatestaticfinalintoutput _ block _ size=256;

private SecureRandom secrand;

private Cipher rsaCipher;

私有密钥对密钥;

private Map allUserKeys;

公共编码器() throws Exception { )。

try {

allUserKeys=new HashMap (;

secrand=new SecureRandom (;

//SunJCE Provider仅支持ECB模式。 尝试了只有PKCS1PADDING可以直接恢复原始数据。

//NOPadding解压缩的是blocksize长度的数据,必须自己处理

//见Java.sun.com/Java se/6/docs/tech notes/guides/security/sun providers.html # sunjce provider

//

//又见open-JDK-6.b17-src (/www.docjar.com/html/API/com/sun/crypto/provider/RSA cipher.Java.HTT er/HTT

//中代码注释。 使用RSA加密大量数据不是标准的用法。 因此,当前正在执行一次doFinal调用来执行RSA操作。

如果在doFinal中加密长度大于或等于一个操作允许的长度的数据,则会抛出异常。

根据keysize的长度,典型的1024个长度的key和PKCS1PADDING一起使用时

//一次doFinal调用只能加密117个byte的数据。 (在NOPadding和1024 keysize的情况下为128字节长)

//) 2048长度的key和PKCS1PADDING经常被允许245字节一次)

//想用来加密大量数据只能自己用其他方法实现。 RSA的加密速度可能很慢。 必须使用AES

RSA cipher=cipher.getinstance (RSA/ECB/PK CS1 padding );

} catch (nosuchalgorithmexceptione ) )

e .打印任务跟踪(;

}catch(nosuchpaddingexceptione ) )

e .打印任务跟踪(;

throw e;

}

ObjectInputStream in;

try {

in=new object inputstream (new file inputstream ) key_filename );

}catch(filenotfoundexceptione ) {

if(false==generatekeys ()

{

throw e;

}

LoadKeys (;

返回;

}

kys=(keypair ) in.readObject );

in.close (;

LoadKeys (;

}

/*

*生成自己的公钥和私钥

*/

私有布尔生成密钥

try {

keypairgeneratorkeygen=key pair generator.getinstance (RSA );

//secrand=new SecureRandom (;

//sedSeed之后生成的所有密钥都是相同的

//secr and.set seed (' chatencrptor '.getbytes ); //初始化随机生成器

//key长度至少为512长度,但据说现在使用2048很安全

keygen.initialize(key_size,secrand ); //初始化密钥生成器

keys=keygen.generateKeyPair (; //生成密钥组

addkey('me ',encodekey ) keys.getpublic );

} catch (nosuchalgorithmexceptione ) )

e .打印任务跟踪(;

返回假;

}

ObjectOutputStream out;

try {

out=new object output stream (new file output stream ) key_filename );

}catch(ioexceptione ) {

e .打印任务跟踪(;

返回假;

}

try {

out.writeobject(keys;

}catch(ioexceptione ) {

e .打印任务跟踪(;

返回假;

} finally {

try {

out.close (;

}catch(ioexceptione ) {

e .打印堆栈跟踪(;

返回假;

}

}

返回真;

}

来源:考试大-Java认证

编辑责任:xxm注释纠错

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。