当前位置: 首页 > 知识库问答 >
问题:

解密TLS 1.2 AES-GCM数据包

欧阳正德
2023-03-14

我正在编写一个Java程序来解密TLS1.2会话,它使用TLS_RSA_WITH_AES_128_GCM_SHA256密码。我使用Wireshark录制了一个测试会话。主秘已知。

No.     Time           Protocol Length Info
      4 0.000124000    TLSv1.2  166    Client Hello
      6 0.000202000    TLSv1.2  1074   Server Hello, Certificate, Server Hello Done
      8 0.001071000    TLSv1.2  393    Client Key Exchange, Change Cipher Spec, Finished
      9 0.003714000    TLSv1.2  301    New Session Ticket, Change Cipher Spec, Finished
     11 6.443056000    TLSv1.2  116    Application Data
     12 6.443245000    TLSv1.2  765    Application Data
     15 6.443390000    TLSv1.2  103    Alert (Level: Warning, Description: Close Notify)
Cipher:        TLS_RSA_WITH_AES_128_GCM_SHA256
Client Random: 375f5632ba9075b88dd83eeeed4adb427d4011298efb79fb2bf78f4a4b7d9d95
Server Random: 5a1b3957e3bd1644e7083e25c64f137ed2803b680e43395a82e5b302b64ba763    
Master Secret: 2FB179AB70CD4CA2C1285B4B1E294F8F44B7E8DA26B62D00EE35181575EAB04C
           4FA11C0DA3ABABB4AF8D09ACB4CCC3CD
Direction is Client -> Server.
Secure Sockets Layer
    TLSv1.2 Record Layer: Application Data Protocol: Application Data
    Content Type: Application Data (23)
    Version: TLS 1.2 (0x0303)
    Length: 45
    Encrypted Application Data: c91de005e2ae50a8a57abee55c183667b136343feef4a387cb7cf83030a47e230af268378c4f33c8b5bab3d26d

这里我只需要客户机密钥,因为我想解密一个客户机->服务器包。我按照RFC扩展了服务器和客户端密钥以及IVs。客户端写入密钥:4b119dfbfc930abe130030bd53c3bf78客户端写入IV:2029cae2

即兴:

我从salt创建AES-GCM nonce(=客户端写IV)和显式nonce(=加密数据的前8字节)。盐:2029CAE2明示nonce:C91DE005E2AE50A8 nonce:2029CAE2C91DE005E2AE50A8

byte[] aad = {0, 0, 0, 0, 0, 0, 0, 1,   // seq_no uint64
    0x17,               // type 0x17 = Application Data
    0x03, 0x03,             //  TLS Version 1.2
    0, 45};             // 45 Bytes of encrypted data

代码:

现在我把所有东西都输入到BouncyCastle中:

AEADParameters parameters = new AEADParameters(new KeyParameter(clientWriteKey), 128, nonce, aad);
GCMBlockCipher gcmBlockCipher = new GCMBlockCipher(new AESFastEngine());
gcmBlockCipher.init(false, parameters);
byte[] plainText = new byte[gcmBlockCipher.getOutputSize(cipherText.length)];
try {
    int decLen = gcmBlockCipher.processBytes(cipherText, 0, cipherText.length, plainText, 0);
    decLen += gcmBlockCipher.doFinal(plainText, decLen);
} catch (InvalidCipherTextException e) {
    System.out.println("MAC failed: " + e.getMessage());
}

这总是抛出MAC failed:MAC check in GCM失败。但解密后的输出是正确的:

byte[] decomp = decompress(plainText);
System.out.println(new String(decomp, "UTF-8"));
public static byte[] decompress(byte[] data) throws IOException, DataFormatException {
    Inflater inflater = new Inflater(true);
    inflater.setInput(data);

    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
    byte[] buffer = new byte[1024];
    while (inflater.getRemaining() > 0) {
        int count = inflater.inflate(buffer);
        outputStream.write(buffer, 0, count);
    }
    outputStream.close();
    byte[] output = outputStream.toByteArray();

    inflater.end();
    return output;
    }

共有1个答案

李招
2023-03-14

GCM模式从消息、相关数据和公共随机数中计算MAC,您已经很好地覆盖了它。

我认为你使用的长度是错误的,它应该是明文长度之前加密和追加Mac。尝试45-8(显式nonce)-16(MAC)=21。

 类似资料:
  • 我已经使用OpenSSL AES-256-GCM加密了一个文件。由于aes-256-gcm不受命令行支持,我已经安装了LibreSSL,我可以使用下面的命令加密文件的数据。 openssl ENC-AES-256-GCM-K 616161616161616161616161616161616161616161616161616161616161616161-IV 768A5C31A97D5FE9-

  • 我有一个给定的加密消息(解密,它是“加密的秘密消息”),我正在尝试从AES-GCM 256加密的一个中检索这个原始字符串。我使用板条箱来执行以下操作: 这是my Cargo.toml的部分: 看起来像是加密消息无效的错误,加密消息、密钥或随机数无效的错误,但事实并非如此。我写了一个Python程序,它做完全相同的事情,它工作;输出的确实是! 我希望能够在Rust中解密这些加密消息,而不是在Pyth

  • 我正在尝试用AES解密来解密一个Base64Encoded字符串消息。 从输入中提取IV和加密文本 使用IV和相同的密码短语生成用于加密文本的密钥。密钥生成应遵循以下相同的步骤。 生成PBE密钥(256位) 用法: 任何线索将非常感谢,我想知道我是否错过了一些配置或数据转换时,试图转换在SWIFT。

  • 我试图创建一个应用程序在NodeJS(电子)作为一个跨平台桌面应用程序。这将与iOS上使用SWIFT开发的移动应用程序配对。作为共享数据的一部分,它使用AES-256-GCM算法进行加密。我在SWIFT中有以下加密和解密方法: 对于NodeJS,我有以下函数: null 下面是Java代码: 数据:这是数据 密钥:密码 根据我所读到的,Java将生成包含AuthTag的加密文本。我尝试将AuthT

  • 这是一个错误: 1.JS