Reply To: Cannot ChangeKey, Get 1E response.

Forum MIFARE SDK Cannot ChangeKey, Get 1E response. Reply To: Cannot ChangeKey, Get 1E response.

Re: Cannot ChangeKey, Get 1E response.

16. March 2016 at 11:20
This is a code example:

public void ChangeKey(byte keyNo, byte[] sessionKey, byte[] key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}

if (key.Length != 16)
{
throw new ArgumentException("Invalid key length.");
}

byte[] encryptionKey;

switch (sessionKey.Length)
{
case 8:
encryptionKey = new byte[16];
Array.Copy(sessionKey, 0, encryptionKey, 0, 8);
Array.Copy(sessionKey, 0, encryptionKey, 8, 8);
break;
case 16:
case 24:
encryptionKey = sessionKey;
break;
default:
throw new ArgumentException("Invalid session key length. Must be single, double or triple DES.");
}

byte[] versionedKey = Common.Utils.VersionKey(0, key);

//ushort crc1 = Common.CheckSum.CalculateCRC16(versionedKey);
byte[] crc = Common.CheckSum.DESFireCRC(versionedKey);

byte[] data = new byte[24];
Array.Copy(versionedKey, 0, data, 0, 16);
data[16] = crc[0]; // (byte)crc;
data[17] = crc[1]; // (byte)(crc >> 8);
data[18] = 0x00;
data[19] = 0x00;
data[21] = 0x00;
data[22] = 0x00;
data[23] = 0x00;

byte[] iv = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 };
byte[] cmd = new byte[26];
cmd[0] = 0xC4;
cmd[1] = keyNo;

using (TripleDESCryptoServiceProvider provider = new TripleDESCryptoServiceProvider())
{
provider.Mode = CipherMode.CBC;
provider.BlockSize = 64;
provider.KeySize = encryptionKey.Length * 8;
provider.Padding = PaddingMode.None;

using (ICryptoTransform transform = Common.TripleDESCryptoServiceProviderHelper.CreateWeakDecryptor(provider, encryptionKey, iv))
{
byte[] encryptedData = transform.TransformFinalBlock(data, 0, data.Length);
Array.Copy(encryptedData, 0, cmd, 2, 24);
}
}

byte[] response = _reader.Transmit(cmd);

if ((response.Length != 1) || (response[0] != 0))
{
throw new Common.CardException("A6118", String.Format("Failed to change key number 0x{0:X2}. Status 0x{1:X2}.", keyNo, response[0]));
}
}

+ 0  |  - 0