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

使用AES加密数据测试RESTendpoint

弓智明
2023-03-14
public String encrypt(final Long transactionId) {
    Assert.notNull(transactionId, "Transaction Id Should Not Be null");
    String encryptedText = "";
    try
    {   final byte[] encodedSecretKey = Base64.decodeBase64(encryptKey);
        final SecretKeySpec secretKey = new SecretKeySpec(encodedSecretKey, "AES");
        Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
        cipher.init(1, secretKey);
        final byte[] contentAsBytes = transactionId.toString().getBytes();
        byte[] contentAsByteCypherText = cipher.doFinal(contentAsBytes);

        byte[] iv = cipher.getIV();
        byte[] message = new byte[NUMBER_OF_IV_BYTES + contentAsByteCypherText.length];
        System.arraycopy(iv, SRC_POSITION, message, DEST_POSITION, NUMBER_OF_IV_BYTES);
        System.arraycopy(contentAsByteCypherText, SRC_POSITION, message, NUMBER_OF_IV_BYTES, contentAsByteCypherText.length);
        encryptedText = Base64.encodeBase64URLSafeString(message);

    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
        LOGGER.error("Failed to encrypt Transaction ID ", e);
        throw new BlahException("Failed to encrypt transaction id", e);
    }
    return encryptedText;
}

我的测试

public void testJourney(final Long transactionId) throws Exception {
    final String request = loadExpectedContent(transactionId);
    mockRestServiceServer.reset();
    mockRestServiceServer.expect(requestTo("/spring/rest/transaction/" + webClient.encrypt(transactionId)))
            .andExpect(method(HttpMethod.GET))
            .andRespond(withSuccess().contentType(MediaType.APPLICATION_JSON).body(request));
    final CompletableFuture<String> completable = webClient.getWebJourney(transactionId);
    mockRestServiceServer.verify();
    final String response = completable.get();
    Assert.assertNotNull(response);
    LOGGER.info(LoggingUtils.format(LoggingUtils.keyValue("Request", transactionId),
            LoggingUtils.keyValue("Response", LoggingUtils.parse(response))));
}

在这个测试中,encrypt方法被命中两次。

  1. 尝试创建Expect时
  2. 在webclient.getwebrourge(transactionId)
  3. 内部

不同之处在于当cipher.getInstance(“aes/gcm/nopadding”);使用这两次时,它返回两个不同的值,测试失败。但是当使用cipher.getinstance(“aes”);时(没有IV),它两次返回相同的值。

我的问题是如何使用“AES/GCM/Nopadding”测试这个RESTendpoint?

共有1个答案

严永丰
2023-03-14

为了测试它,你不想得到相同的密文,你想在解密后得到相同的明文。使用GCM,您希望测试对某些内容进行两次加密,但不会得到相同的结果。

您不应该重复使用IV值(对于GCM,相同的IV和明文导致相同的密文)。

所以这个:

        byte[] iv = cipher.getIV();
    null
 类似资料:
  • 我正在尝试通过使用本文中描述的步骤来加密/解密一些数据get-a-illegalblock size异常数据必须不超过256字节。我应该怎么做很清楚,但即使我做错了什么。 这是我的课: 我尝试过这个方法,因为我认为问题在于AES使用的填充1,但我错了<运行了一段时间后,我得到了一些结果: [ENCRYPT]之前的数据: 之后的数据: 键之前: 之后的关键: [解密]密钥之前: 之后的关键: 之前的

  • 问题内容: 我尝试解密最初使用Java中的Objective-C加密的数据。 还有其他问题要提及,但是它们确实很混乱,许多问题还没有解决,因此我将发表自己的问题。 这是加密数据的代码: 我执行此功能,并使用以下代码将结果数据写入光盘: 在Java中,我使用以下代码来尝试实现相同的行为: 如果现在尝试解密通过Objective-C加密的文件,则会收到错误的填充异常。如果我打开两个带有加密内容的文件,

  • 问题内容: 我正在连接一个旧的Java应用程序(无法更改该应用程序),该应用程序正在使用AES加密数据。这是原始Java代码如何实例化AES密码: 我是C / C ++开发人员,而不是Java,但是从我可以看出来的传统Java代码中,既没有指定模式,也没有指定初始化向量。有人偶然知道默认情况下将使用什么Java,因为未指定它? 我们需要新的C / C ++应用程序来解密Java加密的数据。但是我不

  • 本文向大家介绍如何在PHP中使用AES加密算法加密数据,包括了如何在PHP中使用AES加密算法加密数据的使用技巧和注意事项,需要的朋友参考一下 在研究Discuz 的时候,发现Discuz有一套相当完美的加密算法(相对而言)。这个算法可以将数据加密后,储存起来,到需要用的时候,用之前加密的秘钥将之还原。 除了这个之外,还有AES这个算法能够将数据很好的加密起来,在传输过程中不容易被破解。 在PHP

  • 我正在尝试构建一个程序,该程序接收一个文件(任意大小的EXE),对其进行加密并将其复制到一个结构中。然后稍后对其进行解密,并确保其与使用时相同。 我有一个艰难的时间加密,然后解密文件。它似乎没有正确加密,我不知道如何测试它。 以下是我的问题: 我在这里做错了什么? 是否有更好的库使用AES加密?或者我应该坚持openSSL 让我们说我想用另一个键说“你好世界”。我能不能用这个字符串作为加密算法的参

  • 我正在尝试解密AES加密数据(在. NET中加密),但我的解密结果字符串似乎不可读,并且我没有收到任何错误。 数据加密使用: < li>Padding: PKCS7Padding < li>KeySize: 128 < li >模式:CBC, 我有InItVector、PassCode、salt和NumberOfPassword(3)次迭代。 这是我的代码: 下面是在 .NET 端加密数据的代码: