使用Bouncy Castle在C#中加密和使用AES在Python中解密的问题(EAX模式)

jjwebb

我正在尝试使用C#加密文本并使用AES中的EAX模式在python中解密文本。我在C#中使用Bouncy Castle进行EAX,在Python中使用AES。

我能够在C#和Python中成功加密和解密,但是我注意到,当C#加密文本时,输出的时间明显长于Python加密时的时间。

不知道它是否相关,但是我正在通过服务器将其从C#发送到Python,并且我确认一切都按原样发送。客户端正在运行Android模拟器,而服务器正在运行Windows 10。

我用来测试C#代码的方法:

const int MAC_LEN = 16
//The Key and Nonce are randomly generated
AeadParameters parameters = new AeadParameters(key, MAC_LEN * 8, nonce);

string EaxTest(string text, byte[] key, AeadParameters parameters)
{
    KeyParameter sessKey = new KeyParameter(key);
    EaxBlockCipher encCipher = new EAXBlockCipher(new AesEngine());
    EaxBlockCipher decCipher = new EAXBlockCipher(new AesEngine());

    encCipher.Init(true, parameters);
    byte[] input = Encoding.Default.GetBytes(text);
    byte[] encData = new byte[encCipher.GetOutputSize(input.Length)];
    int outOff = encCipher.ProcessBytes(input, 0, input.Length, encData, 0);
    outOff += encCipher.DoFinal(encData, outOff);

    decCipher.Init(false, parameters);
    byte[] decData = new byte[decCipher.GetOutputSize(outOff)];
    int resultLen = decCipher.ProcessBytes(encData, 0, outOff, decData, 0);
    resultLen += decCipher.DoFinal(decData, resultLen);
    return Encoding.Default.GetString(decData);
}

我用来测试python代码的方法:

def encrypt_text(data, key):
    cipher = AES.new(key, AES.MODE_EAX)
    nonce = cipher.nonce
    cipher_text, mac_tag = cipher.encrypt_and_digest(data)
    return [cipher_text, mac_tag, nonce]


def decrypt_text(data, key, mac_tag, nonce):
    decrypt = AES.new(key, AES.MODE_EAX, nonce=nonce, mac_len=16)
    plaintext = decrypt.decrypt_and_verify(data, mac_tag)
    return plaintext

为了测试字符串“ a”,在C#中,我始终获得17字节的加密文本,而在python中,我始终获得1字节的加密文本。当我尝试在python中解密时,出现此错误[ValueError:MAC检查失败]。Mac和随机数始终为16字节。

示例C#输出:34 2D 0A E9 8A 37 AC 67 0E 95 DB 91 D7 8C E5 4E 9F

示例Python输出:DD

马丁·波德威斯

C#中的默认编码为UTF-16LE,它应为您提供两个字节的纯文本,并因此为您提供两个字节的密文。但是,在C#/ Bouncy Castle代码中,返回的密文末尾包含16个字节的身份验证标签。显然,您缺少一个字节,而17个字节短了一个字节。因此密文的传输在某处失败。当然,在这种情况下,验证标签的验证也将失败。

在Python中,密文为1个字节,而身份验证标签为16个字节。这对于输入的单个字节是正确的。您的编码不在给定的代码片段中,但我想它是UTF-8中的一个字节。

确保对C#代码也使用UTF-8,并确保正确传输密文。确保使用要求通过文本接口进行传输的base 64,并且不要跳过零值字节。最后,如果您使用随机随机数,请确保使用密文(通常带前缀)传输它。毕竟您应该没事。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用Bouncy Castle生成keyPair

来自分类Dev

Java:使用Bouncy Castle进行PGP加密

来自分类Dev

使用 Bouncy Castle 库 c# 解密 pdf.p7m 文件的问题

来自分类Dev

在C#中使用Bouncy Castle RC4算法解密字符串

来自分类Dev

Bouncy Castle API如何知道使用哪个密钥加密?

来自分类Dev

我可以使用任何具有 SkipingCipher 接口的东西在 Bouncy Castle 中解密 GCM AES 流吗?

来自分类Dev

如何使用Bouncy Castle编辑Java中的密码套件列表

来自分类Dev

Bouncy Castle中可以使用哪些“安全” ECC曲线?

来自分类Dev

Bouncy Castle中可以使用哪些“安全” ECC曲线?

来自分类Dev

强制使用错误的密钥解密文件-C#+ Bouncy Castle

来自分类Dev

使用 Bouncy Castle 获取 PGP 加密和登录的字符串输出

来自分类Dev

使用Bouncy Castle提供程序创建SSLContext实例

来自分类Dev

通过Bouncy Castle提取GPG密钥使用标志

来自分类Dev

通过Bouncy Castle提取GPG密钥使用标志

来自分类Dev

使用Bouncy Castle PGP从单个文件加载多个公共密钥

来自分类Dev

使用 Bouncy-Castle 库从证书中读取 SubjectAlternativeNames

来自分类Dev

OpenSSL中的TripleDES加密和使用C#解密

来自分类Dev

OpenSSL中的TripleDES加密和使用C#解密

来自分类Dev

使用C加密的数据的JavaScript AES 256解密问题

来自分类Dev

使用AES加密在Swift中加密/解密UIImage

来自分类Dev

如何使用RSA for Chilkat在C#中加密内容并在Java中解密内容?

来自分类Dev

我如何在使用Rijndael的C#中加密的ios中解密文件

来自分类Dev

在c#和PHP之间使用AES加密/解密数据-解密的数据以255,254开头

来自分类Dev

使用ED25519键和Bouncy Castle(Java)对Json进行签名/验证

来自分类Dev

如何使用Java中的Bouncy Castle从CSR文件确定公钥大小?

来自分类Dev

如何使用Java中的Bouncy Castle从CSR文件确定公钥大小?

来自分类Dev

在使用公共密钥在php中加密后,如何使用私有密钥在c#中的块中解密数据?

来自分类Dev

使用bouncycastle在C#中使用cryptodome解密在python中加密的RSA数据会导致错误块不正确

来自分类Dev

C#Bouncy Castle中的RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING-输入太大,无法使用RSA密码

Related 相关文章

  1. 1

    使用Bouncy Castle生成keyPair

  2. 2

    Java:使用Bouncy Castle进行PGP加密

  3. 3

    使用 Bouncy Castle 库 c# 解密 pdf.p7m 文件的问题

  4. 4

    在C#中使用Bouncy Castle RC4算法解密字符串

  5. 5

    Bouncy Castle API如何知道使用哪个密钥加密?

  6. 6

    我可以使用任何具有 SkipingCipher 接口的东西在 Bouncy Castle 中解密 GCM AES 流吗?

  7. 7

    如何使用Bouncy Castle编辑Java中的密码套件列表

  8. 8

    Bouncy Castle中可以使用哪些“安全” ECC曲线?

  9. 9

    Bouncy Castle中可以使用哪些“安全” ECC曲线?

  10. 10

    强制使用错误的密钥解密文件-C#+ Bouncy Castle

  11. 11

    使用 Bouncy Castle 获取 PGP 加密和登录的字符串输出

  12. 12

    使用Bouncy Castle提供程序创建SSLContext实例

  13. 13

    通过Bouncy Castle提取GPG密钥使用标志

  14. 14

    通过Bouncy Castle提取GPG密钥使用标志

  15. 15

    使用Bouncy Castle PGP从单个文件加载多个公共密钥

  16. 16

    使用 Bouncy-Castle 库从证书中读取 SubjectAlternativeNames

  17. 17

    OpenSSL中的TripleDES加密和使用C#解密

  18. 18

    OpenSSL中的TripleDES加密和使用C#解密

  19. 19

    使用C加密的数据的JavaScript AES 256解密问题

  20. 20

    使用AES加密在Swift中加密/解密UIImage

  21. 21

    如何使用RSA for Chilkat在C#中加密内容并在Java中解密内容?

  22. 22

    我如何在使用Rijndael的C#中加密的ios中解密文件

  23. 23

    在c#和PHP之间使用AES加密/解密数据-解密的数据以255,254开头

  24. 24

    使用ED25519键和Bouncy Castle(Java)对Json进行签名/验证

  25. 25

    如何使用Java中的Bouncy Castle从CSR文件确定公钥大小?

  26. 26

    如何使用Java中的Bouncy Castle从CSR文件确定公钥大小?

  27. 27

    在使用公共密钥在php中加密后,如何使用私有密钥在c#中的块中解密数据?

  28. 28

    使用bouncycastle在C#中使用cryptodome解密在python中加密的RSA数据会导致错误块不正确

  29. 29

    C#Bouncy Castle中的RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING-输入太大,无法使用RSA密码

热门标签

归档