这个作业花费了我挺久的时间,不是因为它难,而是自己的java api已经很生疏了,边查边做,虽然做的还是Application的DOS界面,没有使用swt的界面,因而在一些人性化的功能上还有较大欠缺
程序主要输入参数是:用于RSA加密、解密的公钥PublicKey,两个素数值,以及需要加密的数据(由于作业要求给出的是一段大写字符串)
我的处理方法是使用java.math.BigInteger的类,里面有使用公钥加密明文和使用私钥解密消息的方法,不用手写,相当方便,我了解他的计算思路,但是还是不能用程序结构来表达,故使用现有方法。对于输入字符串,我把它转换成ASCII码值,再把它分成两个字符一组,进行加密解密,不过我想如果把整个字符串作为BigInteger类型的数值输入,进行加密,然后解密应该也是可以的,那就是说我的方法在数据处理量和速度上还是可以有所提高的,毕竟我划分后相当于计算14个BigInteger类型的数,办法很笨.....
下面是程序中主要用到的加密、解密方法以及我对输入数据的处理方式,解密数据的还原过程:
解密的函数以及参数:cipherMessage.modPow(this.SecretKey, this.PrimeN);
加密的函数以及参数:plaintmessage.modPow(this.PublicKey, this.PrimeN);
将输入字符串转换成相应的ASCII码:
for(int i=0;i
{
int m = (int) (messagestring.charAt(i)-64);
if(m != -32)
{
if(m>9)
{
messageBuffer.append(m);
}
else
{
messageBuffer.append(0);
messageBuffer.append(m);
}
}
else
{
messageBuffer.append("00");
}
}
每两个字符的相应ASCII码值划分及加密:
for(int Bigi=0;Bigi
{
String messageBufferString = new String(messageBuffer.substring(Bigi, Bigi+4)).trim();
//System.out.println("\nMessageBufferString="+messageBufferString);
BigInteger messageBigInteger = new BigInteger(messageBufferString);
BigInteger returnMessageBigInteger = messagecipher.ComputeEncipherValue(messageBigInteger);
cipherBuffer.append(returnMessageBigInteger+" ");
Bigi += 4;
}
对于加密数据的解密及划分:
for(int i=0;i
{
//System.out.println("\n m ="+m);
if(((int) (cipherstring.charAt(i)-32)) != 0){
m++;
}
else{
String bigIntegerString = new String(cipherstring.substring(i-m, i).trim());
//System.out.println("\n String is:"+bigIntegerString);
BigInteger cipherBigInteger = new BigInteger(bigIntegerString);
m = 0;
BigInteger decipherBigInteger = decipher.ComputeDecipherValue(cipherBigInteger);
if(decipherBigInteger.intValue() <>
cipherBuffer.append("0"+decipherBigInteger+" ");
}
else{
cipherBuffer.append(decipherBigInteger+" ");
}
}
}
数据还原解密的方式与上述过程类似,不再赘述,我要开始模式识别的编成了,matlab......
这个的优化只能wait & continue....
今天晚些时候,我已经做了一个测试,发现通过原有数据的ASCII未经划分直接加密,然后解密,最终无法出现原有数据内容,所以我想问题应该是由于大整数类型数值计算,这个有待查证......