我打算为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注释纠错