comment chiffrer en AES/ECB/128 messages .Net?
A pris les vecteurs à partir de ce site http://www.inconteam.com/software-development/41-encryption/55-aes-test-vectors#aes-ecb-128
En javascript (sjcl) ont le même résultat
var key = [0x2b7e1516,0x28aed2a6,0xabf71588,0x09cf4f3c];
var test = [0x6bc1bee2,0x2e409f96,0xe93d7e11,0x7393172a];
aes = new sjcl.cipher.aes(key);
r = aes.encrypt(test);
console.log(r);
Mais je ne peut pas l'atteindre dans le C#
[TestMethod]
public void EncryptIntsToInts()
{
Int32[] key = { unchecked((Int32)0x2b7e1516), 0x28aed2a6, unchecked((Int32)0xabf71588), 0x09cf4f3c };
Int32[] test = { 0x6bc1bee2,0x2e409f96,unchecked((Int32)0xe93d7e11),0x7393172a };
Int32[] answer = { 0x3ad77bb4, 0x0d7a3660, unchecked((Int32)0xa89ecaf3), 0x2466ef97 };
var r = AES.EncryptIntsToInts(test, key.ToByteArray());
Assert.IsTrue(r.SequenceEqual(answer));
}
static byte[] zeroIV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
public static Int32[] EncryptIntsToInts(Int32[] input, byte[] key)
{
//Check arguments.
if (input == null || input.Length <= 0)
throw new ArgumentNullException("input");
if (key == null || key.Length <= 0)
throw new ArgumentNullException("key");
//Declare the RijndaelManaged object
//used to encrypt the data.
RijndaelManaged aesAlg = null;
byte[] bResult;
try
{
aesAlg = new RijndaelManaged
{
Key = key,
Mode = CipherMode.ECB,
Padding = PaddingMode.None,
KeySize = 128,
BlockSize = 128,
IV = zeroIV
};
ICryptoTransform encryptor = aesAlg.CreateEncryptor();
byte[] bInput = new byte[input.Length * sizeof(int)];
Buffer.BlockCopy(input, 0, bInput, 0, bInput.Length);
bResult = encryptor.TransformFinalBlock(bInput, 0, input.Length);
}
finally
{
if (aesAlg != null)
aesAlg.Clear();
}
int[] iResult = new int[bResult.Length / sizeof(int)];
Buffer.BlockCopy(bResult, 0, iResult, 0, bResult.Length);
return iResult;
}
Quel est mon erreur?
========================================================
Commencer à modifier
Nouveau code de droit où l'ordre des octets, mais il ne fonctionne pas
[TestMethod]
public void EncryptIntsToInts()
{
byte[] key = "2b7e151628aed2a6abf7158809cf4f3c".HEX2Bytes();
byte[] test = "6bc1bee22e409f96e93d7e117393172a".HEX2Bytes();
byte[] answer = "3ad77bb40d7a3660a89ecaf32466ef97".HEX2Bytes();
RijndaelManaged aesAlg = new RijndaelManaged
{
Key = key,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7,
KeySize = 128,
BlockSize = 128,
IV = zeroIV
};
ICryptoTransform encryptor = aesAlg.CreateEncryptor();
var r = encryptor.TransformFinalBlock(test, 0, test.Length);
Assert.IsTrue(r.SequenceEqual(answer));
}
public static byte[] HEX2Bytes(this string hex)
{
if (hex.Length%2 != 0)
{
throw new ArgumentException(String.Format(CultureInfo.InvariantCulture,
"The binary key cannot have an odd number of digits: {0}", hex));
}
byte[] HexAsBytes = new byte[hex.Length/2];
for (int index = 0; index < HexAsBytes.Length; index++)
{
string byteValue = hex.Substring(index*2, 2);
HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
}
return HexAsBytes;
}
static byte[] zeroIV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
Pourquoi la BCE? C'est vraiment la faiblesse de la mode.
exigences du programme externe
Sur la note de côté: C'est le plus simple C# de mise en œuvre de l'AES 128 bits de la BCE fondés sur Texas Instruments AES 128 C mise en œuvre: github.com/jawadkhan92/TI_AES_128_CSharp
exigences du programme externe
Sur la note de côté: C'est le plus simple C# de mise en œuvre de l'AES 128 bits de la BCE fondés sur Texas Instruments AES 128 C mise en œuvre: github.com/jawadkhan92/TI_AES_128_CSharp
OriginalL'auteur SkyN | 2013-01-25
Vous devez vous connecter pour publier un commentaire.
Vous utilisez 32 bits entiers pour définir la clé. Lorsque vous transformer en octets, vous utilisez natif endianness, qui est généralement little-endian. Si votre clé est
16157e2b a6...
et pas2b7e1516 28...
.Je ne voudrais pas utiliser
int
s pour représenter une touche en premier lieu. Mais si vous voulez vraiment, écrire un big endian fonction de conversion.J'ai également fortement déconseillé de mode ECB. Vous pouvez utiliser de la SRC avec HMAC (dans un crypter puis mac de la construction), ou d'utiliser un tiers lib pour mettre en œuvre GCM.
OriginalL'auteur CodesInChaos
Bon code (il suffit d'ajouter une essayer /à l'aide de):
PaddingMode.Zeros
pas.None
? Ou ai-je raté quelque chose?Ressemble à maintenant, il n'est pas à l'aide d'une clé cassée de la conversion.
Ah oui, bonne place. (J'ai été vraiment invitant SkyN pour expliquer le problème lui-même, de sorte qu'il pourrait être intéressant d'un vote.)
OriginalL'auteur SkyN