若要自己开发RSA的话那都是用底层API实现的,自然是无需JCE。但有一个问题须说明,那就是你所提到的JDK1.1.8,是否可以正确执行我不敢确定,因为我手边没有1.1.8的文档,而我使用的所有API均来自1.2.2.至于1.1.8中是否都一样,我不知道,但想必没什么问题。还有一个问题:由于RSA的实现均是纯粹的数学原理,故其算法当然也都是针对数字的。至于文本或二进制代码当然也可以,比如转换为字节数组或纯二进制等,具体使用什么方法最好最快我还没找到。所以这就留给你自己解决好了。不过RSA主要是理解算法,搞明白了这些其余不在话下。
这是第一个代码RSAGenerator,用于生成RSA中的p,q,n,m,e,d并把n,e,d写入磁盘中的RSAKey.ser文件。
import java.security.*;
import java.math.*;
import java.io.*;
class RSAInfo implements Serializable
{
BigInteger e;
BigInteger d;
BigInteger n;
}
public class RSAGenerator
{
RSAInfo info=new RSAInfo();
public static void main(String[] args)
{
RSAGenerator obj=new RSAGenerator();
try{
obj.getParameter();
obj.writeState();
}catch(NoSuchAlgorithmException ex)
{
System.out.println("NoSuchAlgorithmException");
}
catch(IOException ex)
{
System.out.println("IOException");
}
}
public void getParameter() throws NoSuchAlgorithmException
{
int bitlength=100;
int certainty=50;
SecureRandom sRandom=SecureRandom.getInstance("SHA1PRNG");
BigInteger one=new BigInteger("1");
BigInteger p=new BigInteger(bitlength,certainty,sRandom);
BigInteger q=new BigInteger(bitlength,certainty,sRandom);
BigInteger n=p.multiply(q);
BigInteger m=p.subtract(one).multiply((q.subtract(one)));
int len=m.bitLength();
BigInteger e;
while(true)
{
e=new BigInteger(len,sRandom);
if(m.gcd(e).equals(one))break;
}
BigInteger d=e.modInverse(m);
info.e=e;
info.d=d;
info.n=n;
}
public void writeState() throws IOException
{
FileOutputStream fos=new FileOutputStream("RSAKey.ser");
ObjectOutputStream oos=new ObjectOutputStream(fos);
oos.writeObject(info);
oos.flush();
fos.close();
oos.close();
}
}
这是第二个代码RSAEncrypt,用于加密。
import java.security.*;
import java.math.*;
import java.io.*;
public class RSAEncrypt
{
public static void main(String[] args)
{
if(args.length!=1)
{
System.out.println("Usage: java RSAEncrypt Number");
System.exit(1);
}
RSAEncrypt obj=new RSAEncrypt();
try{
obj.encrypt(args[0]);
}catch(ClassNotFoundException ex)
{
System.out.println("ClassNotFoundException");
}
catch(FileNotFoundException ex)
{
System.out.println("FileNotFoundException");
}
catch(IOException ex)
{
System.out.println("IOException");
}
}
public void encrypt(String num) throws ClassNotFoundException,
FileNotFoundException,IOException
{
FileInputStream fis=new FileInputStream("RSAKey.ser");
ObjectInputStream ois=new ObjectInputStream(fis);
RSAInfo info=(RSAInfo)ois.readObject();
BigInteger plainText=new BigInteger(num);
BigInteger cipherText=plainText.modPow(info.e,info.n);
System.out.println("Cipher text is:");
System.out.println(cipherText);
fis.close();
ois.close();
}
}
这是第三个代码RSADecrypt,用于从RSAKey.ser中取出e.d.n解密。
mport java.security.*;
import java.math.*;
import java.io.*;
public class RSADecrypt
{
public static void main(String[] args)
{
if(args.length!=1)
{
System.out.println("Usage: java RSADecrypt Number");
System.exit(1);
}
RSADecrypt obj=new RSADecrypt();
try{
obj.decrypt(args[0]);
}catch(ClassNotFoundException ex)
{
System.out.println("ClassNotFoundException");
}
catch(FileNotFoundException ex)
{
System.out.println("FileNotFoundException");
}
catch(IOException ex)
{
System.out.println("IOException");
}
}
public void decrypt(String num) throws ClassNotFoundException,
FileNotFoundException,IOException
{
FileInputStream fis=new FileInputStream("RSAKey.ser");
ObjectInputStream ois=new ObjectInputStream(fis);
RSAInfo info=(RSAInfo)ois.readObject();
BigInteger cipherText=new BigInteger(num);
BigInteger plainText=cipherText.modPow(info.d,info.n);
System.out.println("Plain text is:");
System.out.println(plainText);
}
}