Crypt2.SetEncodedKey – Help! I Passed a non-Hex String but Told Chilkat it was Hex
You made a mistake and set an AES encryption key in the wrong way like this:
Chilkat.Crypt2 crypt = new Chilkat.Crypt2();
crypt.KeyLength = 256;
crypt.CryptAlgorithm = "aes";
// This is the error. We passed base64 (or anything that is NOT a hexidecimal string)
// And then asked Chilkat to decode it as hex.
crypt.SetEncodedKey("rZFNAfY7CirLtWxKiRU187k9mqcGCBZnV4QrmBvsboE","hex");
And then we proceeded to encrypt lots of data using this key, whatever it was.
So what was the actual 32-byte key used to encrypt?
Answer:
A hex string should an even number of characters, because each byte is encoded as 2 chars. If the length of the string passed in is odd, then Chilkat assumes a leading ‘0’ was omitted. A leading 0 is prepended. For example “10203” becomes “010203”.
Chars in the range from ‘a’ to ‘f’ are converted to uppercase.
For each 2-char pair, the byte value is computed like this (in C/C++ code)
unsigned char v, v2;
char x = str[i];
if (x > '9')
{
v = 10 + x - 'A';
}
else
{
v = x - '0';
}
v *= 16;
x = str[i+1];
if (x > '9')
{
v2 = 10 + x - 'A';
}
else
{
v2 = x - '0';
}
v += v2;
// v is the decoded byte value.
// Note: Because the data contains chars outside the range 0-9A-F,
// the computation will be mod 256 (because v is an unsigned 1-byte char).
Given that the base64 string is shorter than 32 bytes (for a 256-bit key), the decoded result will not be fully 32-bytes.
Bytes having the value 0 are appended to get the full 32-byte key.
For the input: rZFNAfY7CirLtWxKiRU187k9mqcGCBZnV4QrmBvsboE, the resulting secret key in hex is: 3B3F7A127C5B8D4172CE18A4C6AC0CD38F5AE6EFCB8E00000000000000000000