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

Java解码AES编码消息问题

黄博艺
2023-03-14

这是我的java程序:

package com.util;

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

public class Coder1 {

    public static int AES_KEY_SIZE = 256 ;
    public static int IV_SIZE = 16 ;
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException 
    {
        String message = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        message =message +message;
        message =message +message;
        KeyGenerator keygen = KeyGenerator.getInstance("AES") ; // Specifying algorithm key will be used for 
        keygen.init(AES_KEY_SIZE) ; // Specifying Key size to be used, Note: This would need JCE Unlimited Strength to be installed explicitly 
        SecretKey aesKey = keygen.generateKey();

        // Generating IV
        byte iv[] = new byte[IV_SIZE];

        SecureRandom secRandom = new SecureRandom() ;
        secRandom.nextBytes(iv);
        Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
        Cipher decipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
        cipher.init(Cipher.ENCRYPT_MODE, aesKey,new IvParameterSpec(iv));
        decipher.init(Cipher.DECRYPT_MODE, aesKey,new IvParameterSpec(iv));
        byte[] cipherTextInByteArr = cipher.doFinal(message.getBytes());
        byte[] plainTextInByteArr = decipher.doFinal(cipherTextInByteArr);
        System.out.println("Key="+Base64.getEncoder().encodeToString(aesKey.getEncoded())+"|");
        System.out.println("IV="+Base64.getEncoder().encodeToString(iv)+"|");
        System.out.println("Encrypted Text=" + Base64.getEncoder().encodeToString(cipherTextInByteArr)+"|") ;
        System.out.println("Decrypted text=" + new String(plainTextInByteArr));
    }

}
Key=hlnUjh4GM1PegSzl13YFQgI5+I1qcbsmqlBV8vDsVy0=|
IV=ZkqiRuDS7YUrjZMLRr/gfQ==|
Encrypted Text=HFROj40Qh9YagJAS+7saN2/ugqszCPpmjT9Qwy2yt9dCntSbpbYqTt/tW0ju5QO614+S9zQyOdBXFKtNdDew9Ouo9YkmRgRkjY7NNGyVbt+Z5CYCgcwpRmNUuH7Fqyat5H3hFSUi05UyLLA6lIa47wyP7jKsq0rtj1yHth8qN06aisB18s4Cf9YBPbUM72qXS+IcpKLMWEVVw7Q0qA91WRCt9y93SptNUme75D/qCKyym20UJ5f0ZCgijOnnsbWJKci1R179qZ8UthFBjqcZm88VmV1UuA7OsAvzxsyA7iVtwsf9u6UnrlOtoMTl41Q5nLod4unkdbomrXb6hDKhV9ThtCy1ZWPFHhKbEAPMdzUnmmBSwcuGSTKvdPJeHAWH|
Decrypted text=abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890
    <script src="js/cryptojs/rollups/aes.js"></script>
    <script src="js/cryptojs/components/mode-ctr-min.js"></script>
    <script language=javascript>
          ..................
      var result;
      var encoded=CryptoJS.AES.encrypt("hello",
                                       keyArray,
                                       {
                                         iv: ivArray,
                                         mode: CryptoJS.mode.CTR,
                                         padding: CryptoJS.pad.Pkcs7
                                        });

      result=encoded.ciphertext.toString(CryptoJS.enc.Base64);
   </script>
   byte iv[] = new byte[16];
   SecureRandom secRandom = new SecureRandom() ;
   secRandom.nextBytes(iv);       
   Cipher decipher = Cipher.getInstance("AES/CTR/PKCS5PADDING");
   decipher.init(Cipher.DECRYPT_MODE, aesKey,new IvParameterSpec(iv)); 
   byte[] cipherTextInByteArr =Base64.getDecoder().decode(encodedText);
   byte[] plainTextInByteArr = decipher.doFinal(cipherTextInByteArr);     
   String result=new String(plainTextInByteArr,"UTF-8");

共有1个答案

刘明朗
2023-03-14

我终于明白了。根据这个帖子,CTR模式不需要填充。因此javascript程序看起来像:

<script src="js/cryptojs/rollups/aes.js"></script>
<script src="js/cryptojs/components/mode-ctr-min.js"></script>
<script language=javascript>
      ..................
  var result;
  var encoded=CryptoJS.AES.encrypt("hello",
                                   keyArray,
                                   {
                                     iv: ivArray,
                                     mode: CryptoJS.mode.CTR,
                                     padding: CryptoJS.pad.NoPadding
                                    });

  result=encoded.ciphertext.toString(CryptoJS.enc.Base64);
</script>

和java程序类似于:

byte iv[] = new byte[16];
SecureRandom secRandom = new SecureRandom() ;
secRandom.nextBytes(iv);       
Cipher decipher = Cipher.getInstance("AES/CTR/NoPadding");
decipher.init(Cipher.DECRYPT_MODE, aesKey,new IvParameterSpec(iv)); 
byte[] cipherTextInByteArr =Base64.getDecoder().decode(encodedText);
byte[] plainTextInByteArr = decipher.doFinal(cipherTextInByteArr);     
String result=new String(plainTextInByteArr,"UTF-8");
 类似资料:
  • 我已经下载了json和我的对话档案。我坚持使用奇怪的编码。 json的例子: 应该是这样的: 我正试图这样反序列化它: 不幸的是,输出如下: 有人知道Facebook如何编码json吗?我尝试了几种方法,但没有结果。 谢谢你的帮助。

  • 问题内容: 我正在尝试对java中的AES数据进行编码,通过网络发送数据并以ruby对其进行解码。 基本字符串可以正常工作,但是一旦字符串的长度为16个字节或更多,我在解码后的红宝石字符串的编码中就会产生垃圾。我猜想它与填充有关(虽然不确定,因为它甚至影响精确大小为16的字符串) 我尝试使用PKCS或只是在字符串的末尾添加空格以匹配确切的长度而没有运气 还可以有人解释为什么我必须在红宝石中执行“

  • 我正在编写一个netty TCP服务器,它必须根据请求中的值对响应进行编码,例如返回pro buf或JSON。建议的实现方法是什么? 我们的服务器有一个带有解码器、编码器和处理程序的管道。 我考虑使用解码器将正确的编码器添加到管道中,如下所示 这似乎有效,但是否正确?ChannelHandler文档使我想到了这个设计。 可以随时添加或删除通道处理器,因为通道管道是线程安全的。例如,可以在将要交换敏

  • 问题内容: 我有通过base64编码和8bit编码发送的电子邮件。我想知道如何使用imap_fetchstructure检查消息的编码(因为这样做大约两个小时,所以丢失了)然后正确解码。 Gmail和Mailbox(iOS上的应用)以8位发送,而Windows 8的Mail应用以base64发送。无论哪种方式,我都需要通过检测已使用的编码类型来解码其8bit还是base64。 使用PHP 5.1.

  • 本文向大家介绍浅谈编码,解码,乱码的问题,包括了浅谈编码,解码,乱码的问题的使用技巧和注意事项,需要的朋友参考一下 在开发的过程中,我们不可避免的会遇到各种各样的编码,解码,或者乱码问题,很多时候,我们可以正常的解决问题,但是说实在的,我们有可能并不清楚问题到底是怎么被解决的,秉承知其然,更要知其所以然的理念,经过一番研究,就有了下面的这篇文章,鉴于本人功力尚浅,有错误请给予纠正 :-) 编码解码

  • 我在将文本从UTF-8编码转换为UTF-8编码时遇到问题。这里有字节数组, 我正在将其转换为UTF-8字符串并返回字节数组, 据我所知,这是一个3字节的数组。正当但这是我得到的。 这是什么原因?据我所知,在UTF-8 Specials中,2391189组合被称为替换字符。 这也是一个更大问题的一部分。