102 lines
2.1 KiB
C#
102 lines
2.1 KiB
C#
using System;
|
|
|
|
namespace Org.BouncyCastle.Crypto.Parameters;
|
|
|
|
public class DesParameters : KeyParameter
|
|
{
|
|
public const int DesKeyLength = 8;
|
|
|
|
private const int N_DES_WEAK_KEYS = 16;
|
|
|
|
private static readonly byte[] DES_weak_keys = new byte[128]
|
|
{
|
|
1, 1, 1, 1, 1, 1, 1, 1, 31, 31,
|
|
31, 31, 14, 14, 14, 14, 224, 224, 224, 224,
|
|
241, 241, 241, 241, 254, 254, 254, 254, 254, 254,
|
|
254, 254, 1, 254, 1, 254, 1, 254, 1, 254,
|
|
31, 224, 31, 224, 14, 241, 14, 241, 1, 224,
|
|
1, 224, 1, 241, 1, 241, 31, 254, 31, 254,
|
|
14, 254, 14, 254, 1, 31, 1, 31, 1, 14,
|
|
1, 14, 224, 254, 224, 254, 241, 254, 241, 254,
|
|
254, 1, 254, 1, 254, 1, 254, 1, 224, 31,
|
|
224, 31, 241, 14, 241, 14, 224, 1, 224, 1,
|
|
241, 1, 241, 1, 254, 31, 254, 31, 254, 14,
|
|
254, 14, 31, 1, 31, 1, 14, 1, 14, 1,
|
|
254, 224, 254, 224, 254, 241, 254, 241
|
|
};
|
|
|
|
public DesParameters(byte[] key)
|
|
: base(key)
|
|
{
|
|
if (IsWeakKey(key))
|
|
{
|
|
throw new ArgumentException("attempt to create weak DES key");
|
|
}
|
|
}
|
|
|
|
public DesParameters(byte[] key, int keyOff, int keyLen)
|
|
: base(key, keyOff, keyLen)
|
|
{
|
|
if (IsWeakKey(key, keyOff))
|
|
{
|
|
throw new ArgumentException("attempt to create weak DES key");
|
|
}
|
|
}
|
|
|
|
public static bool IsWeakKey(byte[] key, int offset)
|
|
{
|
|
if (key.Length - offset < 8)
|
|
{
|
|
throw new ArgumentException("key material too short.");
|
|
}
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
bool flag = false;
|
|
for (int j = 0; j < 8; j++)
|
|
{
|
|
if (key[j + offset] != DES_weak_keys[i * 8 + j])
|
|
{
|
|
flag = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!flag)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static bool IsWeakKey(byte[] key)
|
|
{
|
|
return IsWeakKey(key, 0);
|
|
}
|
|
|
|
public static byte SetOddParity(byte b)
|
|
{
|
|
uint num = (uint)(b ^ 1);
|
|
num ^= num >> 4;
|
|
num ^= num >> 2;
|
|
num ^= num >> 1;
|
|
num &= 1;
|
|
return (byte)(b ^ num);
|
|
}
|
|
|
|
public static void SetOddParity(byte[] bytes)
|
|
{
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
bytes[i] = SetOddParity(bytes[i]);
|
|
}
|
|
}
|
|
|
|
public static void SetOddParity(byte[] bytes, int off, int len)
|
|
{
|
|
for (int i = 0; i < len; i++)
|
|
{
|
|
bytes[off + i] = SetOddParity(bytes[off + i]);
|
|
}
|
|
}
|
|
}
|