private static byte[] ApplyOddParity(byte[] key)
{
for (var i = 0; i < key.Length; ++i)
{
int keyByte = key[i] & 0xFE; // 254? mask
var parity = 0;
for (var b = keyByte; b != 0; b >>= 1) parity ^= b & 1; // shift right until empty, setting parity xor b bitand 1
key[i] = (byte)(keyByte | (parity == 0 ? 1 : 0)); // set byte = byte bitor (unchange if match) 1 if not parity or 0 for odd
}
return key;
}
public static string EncryptEAN(string eanhex, string decryptedmwkhex)
{
byte[] decryptedmwk = ConvertHexStringToByteArray(decryptedmwkhex);
byte[] asciiean = Encoding.ASCII.GetBytes(eanhex.PadRight(8, ' '));
TripleDESCryptoServiceProvider p = new TripleDESCryptoServiceProvider();
p.Padding = PaddingMode.None;
p.IV = new byte[8];
// p.Mode = CipherMode.CBC; // default
byte[] random = p.Key;// testing: random = FDCrypt.ConvertHexStringToByteArray("95:e4:d7:7c:6d:6c:6c")
byte checksum = GetCheckSum(asciiean);
byte[] eanblock = new byte[16];
Array.Copy(random, 0, eanblock, 0, 7);
eanblock[7] = checksum;
Array.Copy(asciiean, 0, eanblock, 8, 8);// BitConverter.ToString(eanblock)
p.Key = decryptedmwk;
ICryptoTransform e = p.CreateEncryptor();
byte[] result = e.TransformFinalBlock(eanblock, 0, 16);
return BitConverter.ToString(result, 0).Replace("-",String.Empty);
}
public static string GetEncryptedMWK(string decryptedmwkhex, byte[] kek)
{
byte[] decryptedmwk = FDCrypt.ConvertHexStringToByteArray(decryptedmwkhex);
TripleDESCryptoServiceProvider p = new TripleDESCryptoServiceProvider();
p.Padding = PaddingMode.None;
p.IV = new byte[8];
// p.Mode = CipherMode.CBC; // default
byte[] random = p.Key;//random = FDCrypt.ConvertHexStringToByteArray("e7:11:ea:ff:a0:ca:c3:ba")
p.Key = decryptedmwk;// BitConverter.ToString(decryptedmwk)
ICryptoTransform e = p.CreateEncryptor();
byte[] checkvalue = e.TransformFinalBlock(new byte[8], 0, 8);// BitConverter.ToString(checkvalue)
byte[] keyblock = new byte[40];
Array.Copy(random, keyblock, 8);
Array.Copy(decryptedmwk, 0, keyblock, 8, 24);
Array.Copy(checkvalue, 0, keyblock, 32, 8);// BitConverter.ToString(keyblock)
p.Key = kek;
e = p.CreateEncryptor();
byte[] encryptedkeyblock = e.TransformFinalBlock(keyblock, 0, 40);
string result = BitConverter.ToString(encryptedkeyblock,0, 40);
return result.Replace("-",String.Empty); // should be 81 bytes inc null term?
}