AES is a strong algorithm to encrypt or decrypt the data. Java,.NET and C provide different implementation to achieve this kind of encryption. The plugin gives you access to the building blocks of AES in detail: You can change the number of rounds, the IV, and even the S-box to see how this effects the result. In addition to entering the data for the message and the key by yourself, there are several 'official' AES test vectors to choose from.
#!/usr/bin/env python |
importbase64 |
fromCryptoimportRandom |
fromCrypto.CipherimportAES |
BS=16 |
pad=lambdas: s+ (BS-len(s) %BS) *chr(BS-len(s) %BS) |
unpad=lambdas : s[0:-ord(s[-1])] |
classAESCipher: |
def__init__( self, key ): |
self.key=key |
defencrypt( self, raw ): |
raw=pad(raw) |
iv=Random.new().read( AES.block_size ) |
cipher=AES.new( self.key, AES.MODE_CBC, iv ) |
returnbase64.b64encode( iv+cipher.encrypt( raw ) ) |
defdecrypt( self, enc ): |
enc=base64.b64decode(enc) |
iv=enc[:16] |
cipher=AES.new(self.key, AES.MODE_CBC, iv ) |
returnunpad(cipher.decrypt( enc[16:] )) |
cipher=AESCipher('mysecretpassword') |
encrypted=cipher.encrypt('Secret Message A') |
decrypted=cipher.decrypt(encrypted) |
printencrypted |
printdecrypted |
AWESOMESAUCE. |
This only works because the 'mysecretpassword' is 16 bytes. If it were a different (not dividable by 16) amount of bytes you'd get |
Very minor changes to make it python 3 compatible https://gist.github.com/mguezuraga/257a662a51dcde53a267e838e4d387cd Openssl rsa_generate_key_ex. |
lambda removed(pep 8 support) |
In Python 3 using the modifications of Craz1k0ek it still doesn't work with Unicode. For example the input Edit: found a working version: https://stackoverflow.com/a/44212550 |
i think this is aes 128, we have a standard blocksize of 16 bytes (128bit) |
i can't seem to find how to do aes256 |
Please provide the JAVA code equivalent to above which is in python. |
Dec 04, 2007 11:02 PMtom.hundleyLINK
Hi. I'm trying to figure out how to use AES encyption and decryption using the DecryptionKey in the MachineKey. I think I'm on the right track, but I don't know how to get a proper Key and IV from the DecryptionKey to set in my Rijndael manager.
Here is my web config:
<machineKeyvalidationKey='3EF4FE4BD3F9A1CA4F293F521B8E3F492ED855FA4029511934BF221FCE80AE6A13252ED080EE6423A69EC96A3AB6E8F6E3A1B90AE70C97CC3C33FD4E51041879'decryption='AES'decryptionKey='D2B115C0460D0DA0F84A4DC2713435A3B4C49C734E1D7E33'validation='AES'/>
My 'Rijndael Manager' is below. Here is what I'm stuck on right now. I know this Manager class works great if I create a seperate Key and IV in my webconfig that looks like this (actually those are 256 bit not 128 as the class below shows).
<addkey='Key'value='JQZqQLLTQ+yV3jfvwPK7PXlJEiKQqDA9bld/ePSyx+E='/>
<addkey='IV'value='P1I/4wNHVbpM4/o7DwuCi83YAfOLpBwJyPBVkvRX7vs='/>
BUT, the problem with this is if I do that, I'm using two different keys for encryption- one for Membership and one with my own Rijnadael manager. I want to use the same shared DecrytpionKey in the MachineConfig for ALL of my encryption.
This is what I normally do:
RijndaelManagedManagercipherManager = new RijndaelManagedManager(Convert.FromBase64String(ConfigurationManager.AppSettings.Get('Key')), Convert.FromBase64String(ConfigurationManager.AppSettings.Get('IV')));
This is what I WANT to do, using the DecryptKey.
RijndaelManagedManager cipherManager = newRijndaelManagedManager();
cipherManager.IV = ??? Get me from the Machine Key Please!
cipherManager.Key = ??? Get e from the Machine Key Please!
THANK YOU in advance for any help you can give me.
--Tom
____________________________________________________________________
using System.Security.Cryptography;
namespace DOR.Security.Cryptography
///<summary>/// Manages simple encrypt and decrypt functions using the RijndaelManaged provider
///</summary>
publicclassRijndaelManagedManager
{
RijndaelManaged _cipher = null;///<summary>
/// Empty constructor
///</summary>
public RijndaelManagedManager(){
_cipher = InitCipher();
}
///<summary>
/// Pass key and iv to use in operations
///</summary>
///<param name='key'></param>
///<param name='iv'></param>
public RijndaelManagedManager(byte[] key, byte[] iv){
_cipher = InitCipher(key, iv);
}
///<summary>
///
///</summary>
publicbyte[] Key{
get { return _cipher.Key; }set { _cipher.Key = value; }}
///<summary>
///
///</summary>
publicbyte[] IV{
get {}
///<summary>
/// Encrypt the passed byte array
///</summary>
///<param name='plainText'></param>
///<returns></returns>
publicbyte[] Encrypt(byte[] plainText){
ICryptoTransform transform = _cipher.CreateEncryptor();byte[] cipherText = transform.TransformFinalBlock(plainText, 0, plainText.Length);
return cipherText;}
///<summary>
/// Decrypt the passed byte array
///</summary>
///<param name='cipherText'></param>
///<returns></returns>
publicbyte[] Decrypt(byte[] cipherText){
ICryptoTransform transform = _cipher.CreateDecryptor();byte[] plainText = transform.TransformFinalBlock(cipherText, 0, cipherText.Length);
return plainText;}
privateRijndaelManaged InitCipher(){
RijndaelManaged cipher = CreateCipher();cipher.GenerateKey();
cipher.GenerateIV();
return cipher;}
privateRijndaelManaged InitCipher(byte[] key, byte[] iv){
RijndaelManaged cipher = CreateCipher();cipher.Key = key;
cipher.IV = iv;
return cipher;}
privateRijndaelManaged CreateCipher(){
RijndaelManaged cipher = newRijndaelManaged();cipher.KeySize = 128;
cipher.BlockSize = 128;
cipher.Mode = CipherMode.CBC;cipher.Padding = PaddingMode.ISO10126;
}
}
}