首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Eclipse开发 >

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

2013-07-04 
一个加密的java程序。。从C#转换过来的。很多无法解析问题本帖最后由 princelees 于 2013-04-07 13:47:30 编

一个加密的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);


long m = r.multiplyMod(y2, t, p);
foutput.Write(BitConverter.GetBytes(m), 0, MAXINT64LEN);
}
finput.Close();
foutput.Close();
}

//将二进制串进行加密,结果存放在output1和output2中 
public final void ElGamalEncodeBits(long input, RefObject<Long> output1, RefObject<Long> output2)
{
long k = r.nextInt64(0, p - 1);
output1.argvalue = r.modPower(a, k, p);
long pk1 = r.modPower(pk, k, p);
output2.argvalue = r.multiplyMod(input, pk1, p);
}
//将二进制串进行解密,结果存放在input中
public final void ElGamalDecodeBits(RefObject<Long> input, long output1, long output2)
{
long t = r.modPower(output1, sk, p);
t = r.reverse(t, p);
input.argvalue = r.multiplyMod(output2, t, p);
}
//从文件流finput中读入一个Int64型数据
private long inputInt64(FileStream finput)
{
byte[] temp = new byte[MAXINT64LEN];
int count = finput.Read(temp, 0, MAXINT64LEN);
if (count == 0)
{
return -1;
}
long result = BitConverter.ToInt64(temp, 0);
return result;
}
//为加密做准备
private void prepare4Encoding(String inputFile, String transformedFile, long p0)
{
FileStream finput = openFile(inputFile);
if (finput == null)
{
return;
}
String path = Path.GetDirectoryName(inputFile);
String name = Path.GetFileName(inputFile);
String paddedFile = path + "\"+tempPrePadding + name;
FileStream fPadded = createFile(paddedFile);
if (fPadded == null)
{
return;
}
FileStream fTransformed = createFile(transformedFile);
if (fTransformed == null)
{
return;
}
padding_Transform(finput, fPadded, fTransformed, p0);
File.Delete(paddedFile);
}
//在解密完成之后,进行变换
private void postDecoding(String decodedFile, String depaddedFile, long p0)
{
FileStream fDecoded = openFile(decodedFile);
if (fDecoded == null)
{
return;
}
String path = Path.GetDirectoryName(decodedFile);
String name = Path.GetFileName(decodedFile);
String detransformedFile = path + "\"+tempPreTransforming + name;
FileStream fDetransformed = createFile(detransformedFile);
if (fDetransformed == null)
{
return;
}
FileStream fDepadded = createFile(depaddedFile);
if (fDepadded == null)
{
return;
}
detransform_Depadding(fDecoded, fDetransformed, fDepadded, p0);
File.Delete(detransformedFile);
}

private FileStream openFile(String fileName)
{
FileStream file = new FileStream(fileName, FileMode.Open);
if (!file.CanRead)
{
String complain = "不能打开文件" + file + "!";
errorComplain(complain);
file.Close();
return null;
}
return file;
}
//辅助函数
private FileStream createFile(String fileName)
{
FileStream file = new FileStream(fileName, FileMode.Create);


if (!file.CanWrite)
{
String complain = "不能创建文件" + file + "!";
errorComplain(complain);
file.Close();
return null;
}
return file;
}
//辅助函数
private void errorComplain(String complain)
{
JOptionPane.showConfirmDialog(null, complain, "Error", JOptionPane.DEFAULT_OPTION);
}
//进行padding的变换
private void padding_Transform(FileStream finput, FileStream fPadded, FileStream fTransformed, long p0)
{
finput.CopyTo(fPadded);
encodePadding(fPadded);
fPadded.Seek(0, SeekOrigin.Begin);
encodeTransform(fPadded, fTransformed, p0);

finput.Close();
fPadded.Close();
fTransformed.Close();
}
//逆变换
private void detransform_Depadding(FileStream fDecoded, FileStream fDetransformed, FileStream fDepadded, long p0)
{
decodeDeTransform(fDecoded, fDetransformed, p0);
fDetransformed.Seek(0, SeekOrigin.Begin);
decodeDePadding(fDetransformed, fDepadded, p0);

fDecoded.Close();
fDetransformed.Close();
fDepadded.Close();
}
//padding
private void encodePadding(FileStream foutput)
{
long size = foutput.getLength();
long residue;
residue = size % MAXINT64LEN;
residue = MAXINT64LEN - residue;
for (long i = 0; i < residue; i++)
{
foutput.WriteByte(0);
}
byte[] temp = BitConverter.GetBytes(size);
foutput.Write(temp, 0, MAXINT64LEN);
}

private void encodeTransform(FileStream fPadded, FileStream fTransformed, long p0)
{
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 p = (UInt64)p0;
long p = (long)p0;
byte[] tempForInputM = new byte[MAXINT64LEN];
byte[] tempForOutputM;
while (fPadded.Read(tempForInputM, 0, MAXINT64LEN) != 0)
{
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 m = BitConverter.ToUInt64(tempForInputM, 0);
long m = BitConverter.ToUInt64(tempForInputM, 0);
tempForOutputM = BitConverter.GetBytes(m / p + 1);
fTransformed.Write(tempForOutputM, 0, MAXINT64LEN);
tempForOutputM = BitConverter.GetBytes(m % p + 1);
fTransformed.Write(tempForOutputM, 0, MAXINT64LEN);
}
}
private void decodeDeTransform(FileStream fDecoded, FileStream fDetransformed, long p0)
{
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 p = (UInt64)p0;
long p = (long)p0;
byte[] tempForOutputM = new byte[MAXINT64LEN];
while (fDecoded.Read(tempForOutputM, 0, MAXINT64LEN) != 0)
{
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 m1 = BitConverter.ToUInt64(tempForOutputM, 0);


long m1 = BitConverter.ToUInt64(tempForOutputM, 0);
fDecoded.Read(tempForOutputM, 0, MAXINT64LEN);
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 m2 = BitConverter.ToUInt64(tempForOutputM, 0);
long m2 = BitConverter.ToUInt64(tempForOutputM, 0);
m1 -= 1;
m2 -= 1;
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 m = m1 * p + m2;
long m = m1 * p + m2;
fDetransformed.Write(BitConverter.GetBytes(m), 0, MAXINT64LEN);
}
}
private void decodeDePadding(FileStream fDetransformed, FileStream fDepadded, long p0)
{
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 p = (UInt64)p0;
long p = (long)p0;
byte[] tempForOutputM1 = new byte[MAXINT64LEN];
byte[] tempForOutputM2 = new byte[MAXINT64LEN];
long size = fDetransformed.getLength();
while (fDetransformed.Read(tempForOutputM1, 0, MAXINT64LEN) != 0)
{
//如果是倒数第二个字符
if (fDetransformed.Position == size - 1 * MAXINT64LEN)
{
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 padding = BitConverter.ToUInt64(tempForOutputM1, 0);
long padding = BitConverter.ToUInt64(tempForOutputM1, 0);
fDetransformed.Read(tempForOutputM2, 0, MAXINT64LEN);
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 fileLen = BitConverter.ToUInt64(tempForOutputM2, 0);
long fileLen = BitConverter.ToUInt64(tempForOutputM2, 0);
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: UInt64 residue = fileLen % MAXINT64LEN;
long residue = fileLen % MAXINT64LEN;
//C# TO JAVA CONVERTER WARNING: Unsigned integer types have no direct equivalent in Java:
//ORIGINAL LINE: for (UInt64 i = 0; i < residue; i++)
for (long i = 0; i < residue; i++)
{
fDepadded.WriteByte(tempForOutputM1[i]);
}
return;
}
else
{
fDepadded.Write(tempForOutputM1, 0, MAXINT64LEN);
}
}

}



BitConverter无法解析为类FileStream无法解析File无法解析为类型Path无法解析为类型
怎么处理


[解决办法]
无法解析就是木有咯,找不到,从C#转过来的话,需要自己重新写的。

热点排行