当前位置: 代码迷 >> Eclipse >> 一个加密的java程序。从C#转换过来的。很多无法解析有关问题
  详细解决方案

一个加密的java程序。从C#转换过来的。很多无法解析有关问题

热度:106   发布时间:2016-04-23 01:23:45.0
一个加密的java程序。。从C#转换过来的。很多无法解析问题
本帖最后由 princelees 于 2013-04-07 13:47:30 编辑


public class ElGamal
{
private static final int MAXINT64LEN = sizeof(long); //用来作为读取的单位长度
private static final String tempPrePadding = "_elgpad"; //用来生成paded文件的文件名
private static final String tempPreTransforming = "_elgtrans"; //用来生成transformed文件的文件名
private static final int BITSLEN = 60; //密钥的长度
private RandomPrimeGenerator r = new RandomPrimeGenerator(); //用来生成随机数,及进行其他运算

private long p; //大素数
private long a; //生成元
private long sk; //私钥
private long pk; //公钥

public ElGamal(long p, long sk)
{
this.p = p;
this.sk = sk;

}

public final void init4Encode(long a)
{
this.a = a;
this.pk = r.modPower(a, sk, p);
}

//将输入的文件进行变换之后,再加密,输出到输出文件中
public final void Encode(String inputFile, String outputFile)
{
String path = Path.GetDirectoryName(inputFile);
String name = Path.GetFileName(inputFile);
String transformedFile = path + "\\"+tempPreTransforming + name;
prepare4Encoding(inputFile, transformedFile, p);
ElGamalEncode(transformedFile, outputFile);
File.Delete(transformedFile);
}
//将输入的文件进行变换之后,再解密,输出到输出文件中
public final void Decode(String inputFile, String outputFile)
{
String path = Path.GetDirectoryName(inputFile);
String name = Path.GetFileName(inputFile);
String decodedFile = path +"\\"+ tempPrePadding+name;
ElGamalDecode(inputFile, decodedFile);
postDecoding(decodedFile, outputFile, p);
File.Delete(decodedFile);
}
//对于已经经过变换之后的文件,直接进行加密
private void ElGamalEncode(String inputFile, String outputFile)
{
FileStream finput = openFile(inputFile);
if (finput == null)
{
return;
}
FileStream foutput = createFile(outputFile);
if (foutput == null)
{
return;
}

long m;
while ((m = inputInt64(finput)) != -1)
{
long k = r.nextInt64(0, p - 1);
long y1 = r.modPower(a, k, p);
byte[] temp = BitConverter.GetBytes(y1);
foutput.Write(temp, 0, MAXINT64LEN);
long pk1 = r.modPower(pk, k, p);
long y2 = r.multiplyMod(m, pk1, p);
foutput.Write(BitConverter.GetBytes(y2), 0, MAXINT64LEN);
}
finput.Close();
foutput.Close();
}

//将变换之后的文件进行直接解密
private void ElGamalDecode(String inputFile, String outputFile)
{
FileStream finput = openFile(inputFile);
if (finput == null)
{
return;
}
FileStream foutput = createFile(outputFile);
if (foutput == null)
{
return;
}
long y1;
while ((y1 = inputInt64(finput)) != -1)
{
long y2 = inputInt64(finput);
long t = r.modPower(y1, sk, p);
t = r.reverse(t, p);
  相关解决方案