gpt4 book ai didi

c# - 使用 BouncycaSTLe 加密的 AES CTR 模式

转载 作者:太空狗 更新时间:2023-10-30 01:07:03 24 4
gpt4 key购买 nike

我正在尝试使用 Bouncy castle cryptography library in C# 来实现 AES CTR 加密. .NET 提供 RijndaelManaged Crypto Library但它不支持 AES 的 CTR 模式,因此选择了 BouncycaSTLe。

我无法正确编码问题似乎出在 IV 上。

    public string BytesToHex(byte[] bytes)
{
char[] c = new char[bytes.Length * 2];

byte b;

for (int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx)
{
b = ((byte)(bytes[bx] >> 4));
c[cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);

b = ((byte)(bytes[bx] & 0x0F));
c[++cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
}

return new string(c);
}

public byte[] HexToBytes(string str)
{
if (str.Length == 0 || str.Length % 2 != 0)
return new byte[0];

byte[] buffer = new byte[str.Length / 2];
char c;
for (int bx = 0, sx = 0; bx < buffer.Length; ++bx, ++sx)
{
// Convert first half of byte
c = str[sx];
buffer[bx] = (byte)((c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0')) << 4);

// Convert second half of byte
c = str[++sx];
buffer[bx] |= (byte)(c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0'));
}

return buffer;
}
private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)
{
int minSize = cipher.GetOutputSize(data.Length);
byte[] outBuf = new byte[minSize];
int length1 = cipher.ProcessBytes(data, 0, data.Length, outBuf, 0);
int length2 = cipher.DoFinal(outBuf, length1);
int actualLength = length1 + length2;
byte[] result = new byte[actualLength];
Array.Copy(outBuf,result,actualLength);

//System.arraycopy(outBuf, 0, result, 0, result.length);
return result;
}
private static byte[] decryptCTR(byte[] cipher, byte[] key, byte[] iv)
{
//Org.BouncyCastle.Crypto.Modes.SicBlockCipher

PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new SicBlockCipher(new AesEngine()));

ParametersWithIV ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
aes.Init(false, ivAndKey);

return cipherData(aes, cipher);
}
private static byte[] encryptCTR(byte[] plain, byte[] key, byte[] iv)
{
PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new SicBlockCipher(
new AesEngine()));

ParametersWithIV ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);
aes.Init(true, ivAndKey);
return cipherData(aes, plain);
}

我正在尝试使用以下方法解密给定的密文

   private void btnDecryptDirectly_Click(object sender, EventArgs e)
{
String encodedMsgHex = "770b80259ec33beb2561358a9f2dc617e46218c0a53cbeca695ae45faa8952aa0e311bde9d4e01726d3184c34451";
String key = "36f18357be4dbd77f050515c73fcf9f2";
byte [] keyBytes = HexToBytes(key);

byte[] cipher = HexToBytes(encodedMsgHex);

txtDecryptedText = BytesToHex(decryptCTR(cipher, keyBytes, IV));

rtbDecrypted.Text = txtDecryptedText;
}

每次运行都会报错

last block incomplete in decryption

错误。

谁能帮帮我。

最佳答案

您根本不需要使用 PaddedBufferedBlockCipher。计数器模式加密是 block 密码的流模式。流式密码不需要填充。

您可以使用 BufferedBlockCipher 访问流模式,因为 SicBlockCipher 一次只能加密一个 block 。

关于c# - 使用 BouncycaSTLe 加密的 AES CTR 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com