简单的: 处理函数: private void _HandleData(int[] data1, int keyindex, boolean isenc) { IPERM(data1); if (isenc) { FL(data1, 0 + keyindex); FR(data1, 2 + keyindex); FL(data1, 4 + keyindex); FR(data1, 6 + keyindex); FL(data1, 8 + keyindex); FR(data1, 10 + keyindex); FL(data1, 12 + keyindex); FR(data1, 14 + keyindex); FL(data1, 16 + keyindex); FR(data1, 18 + keyindex); FL(data1, 20 + keyindex); FR(data1, 22 + keyindex); FL(data1, 24 + keyindex); FR(data1, 26 + keyindex); FL(data1, 28 + keyindex); FR(data1, 30 + keyindex); } else { FL(data1, 30 + keyindex); FR(data1, 28 + keyindex); FL(data1, 26 + keyindex); FR(data1, 24 + keyindex); FL(data1, 22 + keyindex); FR(data1, 20 + keyindex); FL(data1, 18 + keyindex); FR(data1, 16 + keyindex); FL(data1, 14 + keyindex); FR(data1, 12 + keyindex); FL(data1, 10 + keyindex); FR(data1, 8 + keyindex); FL(data1, 6 + keyindex); FR(data1, 4 + keyindex); FL(data1, 2 + keyindex); FR(data1, 0 + keyindex); } FPERM(data1); int tt = data1[0]; data1[0] = data1[1]; data1[1] = tt; }private static void IPERM(int[] data) { int work; int left = data[0], right = data[1]; right = rotl(right, 4); work = (left ^ right) & 0xf0f0f0f0; left ^= work; right = rotr(right ^ work, 20); work = (left ^ right) & 0xffff0000; left ^= work; right = rotr(right ^ work, 18); work = (left ^ right) & 0x33333333; left ^= work; right = rotr(right ^ work, 6); work = (left ^ right) & 0x00ff00ff; left ^= work; right = rotl(right ^ work, 9); work = (left ^ right) & 0xaaaaaaaa; left = rotl(left^work, 1); right ^= work; data[0] = left; data[1] = right; }private static void FPERM(int[] data) { int work; int left = data[0], right = data[1]; right = rotr(right, 1); work = (left ^ right) & 0xaaaaaaaa; right ^= work; left = rotr(left ^ work, 9); work = (left ^ right) & 0x00ff00ff; right ^= work; left = rotl(left ^ work, 6); work = (left ^ right) & 0x33333333; right ^= work; left = rotl(left ^ work, 18); work = (left ^ right) & 0xffff0000; right ^= work; left = rotl(left ^ work, 20); work = (left ^ right) & 0xf0f0f0f0; right ^= work; left = rotr(left ^ work, 4); data[0] = left; data[1] = right; }private void FL(int[] data, int index) { int l = data[0]; int r = data[1]; int work = rotr(r, 4) ^ this.Key[index]; l ^= Spbox[6][work & 0x3f] ^ Spbox[4][(work >> 8) & 0x3f] ^ Spbox[2][(work >> 16) & 0x3f] ^ Spbox[0][(work >> 24) & 0x3f]; work = r ^ this.Key[index + 1]; l ^= Spbox[7][work & 0x3f] ^ Spbox[5][(work >> 8) & 0x3f] ^ Spbox[3][(work >> 16) & 0x3f] ^ Spbox[1][(work >> 24) & 0x3f]; data[0] = l; }private void FR(int[] data, int index) { int l = data[1]; int r = data[0]; int work = rotr(r, 4) ^ this.Key[index]; l ^= Spbox[6][work & 0x3f] ^ Spbox[4][(work >> 8) & 0x3f] ^ Spbox[2][(work >> 16) & 0x3f] ^ Spbox[0][(work >> 24) & 0x3f]; work = r ^ this.Key[index + 1]; l ^= Spbox[7][work & 0x3f] ^ Spbox[5][(work >> 8) & 0x3f] ^ Spbox[3][(work >> 16) & 0x3f] ^ Spbox[1][(work >> 24) & 0x3f]; data[1] = l; }private static int rotr(int x, int n) { return (x >>> n) | (x << (32 - n)); }private static int rotl(int x, int n) { return (x << n) | (x >>> (32 - n)); }
老兄不看MSDN的吗?private static void EncryptData(String inName, String outName, byte[] tdesKey, byte[] tdesIV) { //Create the file streams to handle the input and output files. FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read); FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); fout.SetLength(0);
//Create variables to help with read and write. byte[] bin = new byte[100]; //This is intermediate storage for the encryption. long rdlen = 0; //This is the total number of bytes written. long totlen = fin.Length; //This is the total length of the input file. int len; //This is the number of bytes to be written at a time. TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider(); CryptoStream encStream = new CryptoStream(fout, tdes.CreateEncryptor(tdesKey, tdesIV), CryptoStreamMode.Write);
Console.WriteLine("Encrypting..."); //Read from the input file, then encrypt and write to the output file. while(rdlen < totlen) { len = fin.Read(bin, 0, 100); encStream.Write(bin, 0, len); rdlen = rdlen + len; Console.WriteLine("{0} bytes processed", rdlen); } encStream.Close(); }
假设DES加密的方法是_HandleData(int[] data, int startindex, bool isencrypt);
isencrypt表明是加密还是解密,true为加密;data是要加密的数据;
那么加密过程是:
_HandleData(data1, 0, true);
_HandleData(data1, 32, false);
_HandleData(data1, 64, true);解密过程是:
_HandleData(data1, 0, false);
_HandleData(data1, 32, true);
_HandleData(data1, 64, false);
注意,DES关键字长度是64位,3DES可能是128或者192位。如果是128位,将前64位追加到最后。
在计算时,关键字是经过处理的,64位最终的关键字是长度为32的整型数组。
处理函数:
private void _HandleData(int[] data1, int keyindex, boolean isenc) {
IPERM(data1);
if (isenc) {
FL(data1, 0 + keyindex);
FR(data1, 2 + keyindex);
FL(data1, 4 + keyindex);
FR(data1, 6 + keyindex);
FL(data1, 8 + keyindex);
FR(data1, 10 + keyindex);
FL(data1, 12 + keyindex);
FR(data1, 14 + keyindex);
FL(data1, 16 + keyindex);
FR(data1, 18 + keyindex);
FL(data1, 20 + keyindex);
FR(data1, 22 + keyindex);
FL(data1, 24 + keyindex);
FR(data1, 26 + keyindex);
FL(data1, 28 + keyindex);
FR(data1, 30 + keyindex);
} else {
FL(data1, 30 + keyindex);
FR(data1, 28 + keyindex);
FL(data1, 26 + keyindex);
FR(data1, 24 + keyindex);
FL(data1, 22 + keyindex);
FR(data1, 20 + keyindex);
FL(data1, 18 + keyindex);
FR(data1, 16 + keyindex);
FL(data1, 14 + keyindex);
FR(data1, 12 + keyindex);
FL(data1, 10 + keyindex);
FR(data1, 8 + keyindex);
FL(data1, 6 + keyindex);
FR(data1, 4 + keyindex);
FL(data1, 2 + keyindex);
FR(data1, 0 + keyindex);
}
FPERM(data1);
int tt = data1[0];
data1[0] = data1[1];
data1[1] = tt;
}private static void IPERM(int[] data) {
int work;
int left = data[0], right = data[1];
right = rotl(right, 4);
work = (left ^ right) & 0xf0f0f0f0;
left ^= work;
right = rotr(right ^ work, 20);
work = (left ^ right) & 0xffff0000;
left ^= work;
right = rotr(right ^ work, 18);
work = (left ^ right) & 0x33333333;
left ^= work;
right = rotr(right ^ work, 6);
work = (left ^ right) & 0x00ff00ff;
left ^= work;
right = rotl(right ^ work, 9);
work = (left ^ right) & 0xaaaaaaaa;
left = rotl(left^work, 1);
right ^= work;
data[0] = left;
data[1] = right;
}private static void FPERM(int[] data) {
int work;
int left = data[0], right = data[1];
right = rotr(right, 1);
work = (left ^ right) & 0xaaaaaaaa;
right ^= work;
left = rotr(left ^ work, 9);
work = (left ^ right) & 0x00ff00ff;
right ^= work;
left = rotl(left ^ work, 6);
work = (left ^ right) & 0x33333333;
right ^= work;
left = rotl(left ^ work, 18);
work = (left ^ right) & 0xffff0000;
right ^= work;
left = rotl(left ^ work, 20);
work = (left ^ right) & 0xf0f0f0f0;
right ^= work;
left = rotr(left ^ work, 4);
data[0] = left;
data[1] = right;
}private void FL(int[] data, int index) {
int l = data[0];
int r = data[1];
int work = rotr(r, 4) ^ this.Key[index];
l ^= Spbox[6][work & 0x3f]
^ Spbox[4][(work >> 8) & 0x3f]
^ Spbox[2][(work >> 16) & 0x3f]
^ Spbox[0][(work >> 24) & 0x3f];
work = r ^ this.Key[index + 1];
l ^= Spbox[7][work & 0x3f]
^ Spbox[5][(work >> 8) & 0x3f]
^ Spbox[3][(work >> 16) & 0x3f]
^ Spbox[1][(work >> 24) & 0x3f];
data[0] = l;
}private void FR(int[] data, int index) {
int l = data[1];
int r = data[0];
int work = rotr(r, 4) ^ this.Key[index];
l ^= Spbox[6][work & 0x3f]
^ Spbox[4][(work >> 8) & 0x3f]
^ Spbox[2][(work >> 16) & 0x3f]
^ Spbox[0][(work >> 24) & 0x3f];
work = r ^ this.Key[index + 1];
l ^= Spbox[7][work & 0x3f]
^ Spbox[5][(work >> 8) & 0x3f]
^ Spbox[3][(work >> 16) & 0x3f]
^ Spbox[1][(work >> 24) & 0x3f];
data[1] = l;
}private static int rotr(int x, int n) {
return (x >>> n) | (x << (32 - n));
}private static int rotl(int x, int n) {
return (x << n) | (x >>> (32 - n));
}
{
//Create the file streams to handle the input and output files.
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
FileStream fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write);
fout.SetLength(0);
//Create variables to help with read and write.
byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
long rdlen = 0; //This is the total number of bytes written.
long totlen = fin.Length; //This is the total length of the input file.
int len; //This is the number of bytes to be written at a time. TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
CryptoStream encStream = new CryptoStream(fout, tdes.CreateEncryptor(tdesKey, tdesIV), CryptoStreamMode.Write);
Console.WriteLine("Encrypting..."); //Read from the input file, then encrypt and write to the output file.
while(rdlen < totlen)
{
len = fin.Read(bin, 0, 100);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
Console.WriteLine("{0} bytes processed", rdlen);
} encStream.Close();
}
而且我搞不清楚她的tdesIV有什么用。