init commit
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user