アプリの文字列の暗号化/復号化に「BouncyCastle.Crypto.dll」を使用しています。次の このブログのコード を使用しています。
上記のリンクで提供されているクラスとまったく同じBCEngineクラスがあります。
public class BCEngine
{
private readonly Encoding _encoding;
private readonly IBlockCipher _blockCipher;
private PaddedBufferedBlockCipher _cipher;
private IBlockCipherPadding _padding;
public BCEngine(IBlockCipher blockCipher, Encoding encoding)
{
_blockCipher = blockCipher;
_encoding = encoding;
}
public void SetPadding(IBlockCipherPadding padding)
{
if (padding != null)
_padding = padding;
}
public string Encrypt(string plain, string key)
{
byte[] result = BouncyCastleCrypto(true, _encoding.GetBytes(plain), key);
return Convert.ToBase64String(result);
}
public string Decrypt(string cipher, string key)
{
byte[] result = BouncyCastleCrypto(false, Convert.FromBase64String(cipher), key);
return _encoding.GetString(result);
}
/// <summary>
///
/// </summary>
/// <param name="forEncrypt"></param>
/// <param name="input"></param>
/// <param name="key"></param>
/// <returns></returns>
/// <exception cref="CryptoException"></exception>
private byte[] BouncyCastleCrypto(bool forEncrypt, byte[] input, string key)
{
try
{
_cipher = _padding == null ? new PaddedBufferedBlockCipher(_blockCipher) : new PaddedBufferedBlockCipher(_blockCipher, _padding);
byte[] keyByte = _encoding.GetBytes(key);
_cipher.Init(forEncrypt, new KeyParameter(keyByte));
return _cipher.DoFinal(input);
}
catch (Org.BouncyCastle.Crypto.CryptoException ex)
{
throw new CryptoException(ex.Message);
}
}
}
私は次のようにコードを記述したasp.netフォームを使用しています:
public partial class EncryptionForm : System.Web.UI.Page
{
Encoding _encoding;
IBlockCipherPadding _padding;
string key = "DFGFRT";
string textToBeEncrypted = "Original text. Please encrypt me.";
string txtEncryptedText = string.empty;
string txtDecryptedText = string.empty;
protected void Page_Load(object sender, EventArgs e)
{
_encoding = Encoding.ASCII;
Pkcs7Padding pkcs = new Pkcs7Padding();
_padding = pkcs;
}
protected void btnEncrypt_Click(object sender, EventArgs e)
{
txtEncryptedText = AESEncryption(textToBeEncrypted, key, true);
}
protected void btnDecrypt_Click(object sender, EventArgs e)
{
txtDecryptedText = AESDecryption(txtEncryptedText.Text, key, true);
}
public string AESEncryption(string plain, string key, bool fips)
{
BCEngine bcEngine = new BCEngine(new AesEngine(), _encoding);
bcEngine.SetPadding(_padding);
return bcEngine.Encrypt(plain, key);
}
public string AESDecryption(string cipher, string key, bool fips)
{
BCEngine bcEngine = new BCEngine(new AesEngine(), _encoding);
bcEngine.SetPadding(_padding);
return bcEngine.Decrypt(cipher, key);
}
}
わかりませんが、何らかの理由により、btnEncrypt_Clickを呼び出すと例外が発生します
「キーの長さが128/192/256ビットではありません。」
どなたかご案内いただけますか?私はこれに対する完全な初心者です。前もって感謝します。
きみの string key = "DFGFRT";
は128/192/256ビットではありません。
DFGFRT
は6文字で、6(または12?)バイト= 8 * 12 = 96ビット(最大)です。
128ビットのキーを取得するには16バイトの文字列が必要なので、安全な側面から16文字の文字列を使用して、シングルバイト文字を使用する場合は128ビットキー、ワイド文字を使用する場合は256ビットキーにします。
かなり単純ですが、キーは "DFGFRT"で、これは6文字/バイト、つまり6 * 8 = 48ビットです。
使用される暗号化方式には、長さが128/192/256ビットのキーが必要です。これは、16/24/32文字/バイトに相当します。