DES在C#下是由
des来实现的,需要KEY和IV,其中如果KEY或者IV不足8字节,用#0 来补足 代码如下:
byte
[] key
=
new
byte
[
8
];
byte
[] iv
=
new
byte
[
8
];
for
(
int
i
=
0
;i
<
8
;i
++
)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
if (i < temp.Length)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
key[i] = temp[i];
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
key[i] = 0;
}
if (i < temp1.Length)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
iv[i] = temp1[i];
}
else
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
iv[i] = 0;
}
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
string
EncryptString(
string
Value,
byte
[] key,
byte
[] iv)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
//des.KeySize = key.Length;
//des.ValidKeySize(key.Length);
//ct = des.CreateEncryptor(key,iv);
des.Key = key;
des.IV = iv;
//des.GenerateIV();
ct = des.CreateEncryptor();
//des.GenerateIV;
byt = Encoding.UTF8.GetBytes(Value);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
cs.Close();
byte[] bytesCipher=ms.ToArray();
return Convert.ToBase64String(bytesCipher);
}
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
private
string
DecryptString(
string
Value,
byte
[] key,
byte
[] iv)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ICryptoTransform ct;
MemoryStream ms;
CryptoStream cs;
byte[] byt;
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
des.Key = key;
des.IV = iv;
ct = des.CreateDecryptor();
//ct = des.CreateDecryptor(key,iv);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
byt = Convert.FromBase64String(Value);
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
ms = new MemoryStream();
cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
cs.Write(byt, 0, byt.Length);
cs.FlushFinalBlock();
![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
cs.Close();
byte[] bytesCipher = ms.ToArray();
return Encoding.UTF8.GetString(bytesCipher);
}
DELPHI下要实现相应的加密和解密,需要自己写DES代码,并加上CBC方式的异或
这里要说明一点,我发现C#下DES明文在加密前,有补足8的倍数的情况,即如果如果是“11111”就会补成“11111#3#3#3”,如果是“11111111”就会“11111111#8#8#8#8#8#8#8#8”,然后在进行异或,最后加密!
演示代码如下:
Encrypt :
=
true
;
temp :
=
edit2.Text;
res :
=
''
;
for
i:
=
0
to
7
do
begin
if
i
>
(length(temp)
-
1
) then
key[i] :
=
0
else
key[i] :
=
byte
(temp[i
+
1
]);
end;
temp :
=
edit3.Text;
for
i:
=
0
to
7
do
begin
if
i
>
(length(temp)
-
1
) then
iv[i]:
=
0
else
iv[i] :
=
byte
(temp[i
+
1
]);
end;
InitEncryptDES(Key, Context, Encrypt);
temp :
=
edit1.Text;
len :
=
length(temp);
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
temp :
=
temp
+
char
(
8
-
(len mod
8
));
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
posnum :
=
0
;
for
i:
=
0
to len
do
begin
poschar:
=
temp[i
+
1
];
Block[posnum] :
=
byte
(poschar);
posnum :
=
posnum
+
1
;
if
posnum
=
8
then begin
EncryptDESCBC(Context, IV, Block);
for
j:
=
0
to
7
do
begin
res :
=
res
+
char
(block[j]);
end;
iv :
=
block;
posnum :
=
0
;
end;
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
end;
if
posnum
<>
0
then begin
for
i:
=
posnum to
7
do
begin
Block[i] :
=
byte
(poschar);
end;
EncryptDESCBC(Context, IV, Block);
for
j:
=
0
to
7
do
begin
res :
=
res
+
char
(block[j]);
end;
posnum :
=
0
;
end;
edit4.Text :
=
IdEncoderMIME1.EncodeString(res);
Encrypt :
=
false
;
temp :
=
edit2.Text;
res :
=
''
;
for
i:
=
0
to
7
do
begin
if
i
>
(length(temp)
-
1
) then
key[i] :
=
0
else
key[i] :
=
byte
(temp[i
+
1
]);
end;
temp :
=
edit3.Text;
for
i:
=
0
to
7
do
begin
if
i
>
(length(temp)
-
1
) then
iv[i] :
=
0
else
iv[i] :
=
byte
(temp[i
+
1
]);
end;
InitEncryptDES(Key, Context, Encrypt);
//
for i:=0 to 7 do block[0] := 0;
temp :
=
IdDecoderMIME1.DecodeString(edit4.Text) ;
posnum :
=
0
;
for
i:
=
0
to length(temp)
-
1
do
begin
Block[posnum] :
=
byte
(temp[i
+
1
]);
posnum :
=
posnum
+
1
;
if
posnum
=
8
then begin
bak :
=
block;
EncryptDESCBC(Context, IV, Block);
for
j:
=
0
to
7
do
begin
//
temp := temp+inttostr(byte(block[i]))+' ';
res :
=
res
+
char
(block[j]);
end;
iv :
=
bak;
posnum :
=
0
;
end;
end;
if
posnum
<>
0
then begin
showmessage(
'
解密出错
'
);
end
else
begin
temp:
=
''
;
//
len := res[length(res)] ;
for
i:
=
1
to length(res)
do
begin
temp :
=
temp
+
char
(res[i]);
end;
edit1.Text :
=
trim(temp);
end;