Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 32个字符的字符串如何变成46个字节?_Java_String_Utf 8_Ascii - Fatal编程技术网

Java 32个字符的字符串如何变成46个字节?

Java 32个字符的字符串如何变成46个字节?,java,string,utf-8,ascii,Java,String,Utf 8,Ascii,我正试图学习一些加密技术,但不知怎的,我遇到了一个问题。我想对文本(比如字符串“password”)执行某种AES加密。我将ff代码作为我的源代码: import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.spec.SecretKeySpec; import

我正试图学习一些加密技术,但不知怎的,我遇到了一个问题。我想对文本(比如字符串“password”)执行某种AES加密。我将ff代码作为我的源代码:

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.Cipher;


public class AES {
    static String IV = "fedcba9876543210";
    static String plaintext = "password"; /*Note null padding*/

    //static String encryptionKey = "0123456789abcdef0123456789abcdef";
    static String encKey = "cf6000c7452f9487cc03cd721a3f18482e43cdcc37c380e062193c489f968d04";
    static String encryptionKey = "";
    public static void main(String [] args) {
        try {
            System.out.print(plaintext.length() + "\n");
            if (plaintext.length() < 16) {
                int pad = 16 - plaintext.length();
                String repeated = new String(new char[pad]).replace("\0", "\0");
                plaintext = plaintext + repeated;
            }
            System.out.println("==Java==");
            System.out.println("plain:   " + plaintext);
            System.out.print(plaintext.length() + "\n");

            encryptionKey = hexToAscii(encKey);
            //encryptionKey = "0123456789abcdef0123456789abcdef";

            byte[] cipher = encrypt(plaintext, encryptionKey);
            String a = byteArrayToHex(cipher);
            System.out.print(a + "\n");

            System.out.print("cipher:  ");
            for (int i=0; i<cipher.length; i++)
                System.out.print(new Integer(cipher[i])+" ");
            System.out.println("");

            String decrypted = decrypt(cipher, encryptionKey);

            System.out.println("decrypt: " + decrypted);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static byte[] encrypt(String plainText, String string) throws Exception {
        //System.out.println("encrypting" + encryptionKey.length());


// Check length, in characters
        System.out.println("Length of string is " + string.length()); // prints "11"

// Check encoded sizes
        final byte[] utf8Bytes = string.getBytes("UTF-8");
        System.out.println(utf8Bytes.length); // prints "11"

        final byte[] utf16Bytes= string.getBytes("UTF-16");
        System.out.println(utf16Bytes.length); // prints "24"

        final byte[] utf32Bytes = string.getBytes("UTF-32");
        System.out.println(utf32Bytes.length); // prints "44"

        final byte[] isoBytes = string.getBytes("ISO-8859-1");
        System.out.println(isoBytes.length); // prints "11"

        final byte[] winBytes = string.getBytes("CP1252");
        System.out.println(winBytes.length); // prints "11"

        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        System.out.println("enc 2");

        SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
        System.out.println("enc 3");

        cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
        System.out.println("enc 4");
        return cipher.doFinal(plainText.getBytes("UTF-8"));
    }

    public static String hexToAscii(String s) {
        int n = s.length();
        StringBuilder sb = new StringBuilder(n / 2);
        for (int i = 0; i < n; i += 2) {
            char a = s.charAt(i);
            char b = s.charAt(i + 1);
            sb.append((char) ((hexToInt(a) << 4) | hexToInt(b)));
        }
        return sb.toString();
    }


    public static String decrypt(byte[] cipherText, String encryptionKey) throws Exception{
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
        cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(IV.getBytes("UTF-8")));
        return new String(cipher.doFinal(cipherText),"UTF-8");
    }
    public static String byteArrayToHex(byte[] a) {
        StringBuilder sb = new StringBuilder(a.length * 2);
        for(byte b: a)
            sb.append(String.format("%02x", b & 0xff));
        return sb.toString();
    }

    private static int hexToInt(char ch) {
        if ('a' <= ch && ch <= 'f') { return ch - 'a' + 10; }
        if ('A' <= ch && ch <= 'F') { return ch - 'A' + 10; }
        if ('0' <= ch && ch <= '9') { return ch - '0'; }
        throw new IllegalArgumentException(String.valueOf(ch));
    }
}
import java.io.UnsupportedEncodingException;
导入java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
导入javax.crypto.spec.SecretKeySpec;
导入javax.crypto.spec.IvParameterSpec;
导入javax.crypto.Cipher;
公共类AES{
静态字符串IV=“fedcba9876543210”;
静态字符串plaintext=“password”/*注意空填充*/
//静态字符串加密密钥=“0123456789abcdef0123456789abcdef”;
静态字符串encKey=“CF6000C7452F9487CC03CD721A3F18482E43CDC37C380E062193C489F968D04”;
静态字符串encryptionKey=“”;
公共静态void main(字符串[]args){
试一试{
System.out.print(明文.length()+“\n”);
if(明文.length()<16){
int pad=16-纯文本.length();
字符串重复=新字符串(新字符[pad])。替换(“\0”,“\0”);
纯文本=纯文本+重复;
}
System.out.println(“==Java=”);
System.out.println(“纯:+纯文本);
System.out.print(明文.length()+“\n”);
encryptionKey=hexToAscii(encKey);
//encryptionKey=“0123456789abcdef0123456789abcdef”;
字节[]密码=加密(明文,加密密钥);
字符串a=byteArrayToHex(密码);
系统输出打印(a+“\n”);
系统输出打印(“密码:”);

对于(inti=0;i,不要假设字符串中的一个字符占用一个字节

在大多数编码中,这是正确的,仅适用于小于128的字符

由于
hexToAscii
返回的字符串的字符范围为128-255,因此这些字符将被编码为多个字节


解决方案不是将密钥视为字符串。字符串代表文本;加密密钥不是文本,而是字节序列。将加密密钥存储在字节数组中。
hexToAscii
应返回字节数组,而
encrypt
应只需在明文上调用
getBytes

切勿假设启用该选项字符串中的e字符占用一个字节

在大多数编码中,这是正确的,仅适用于小于128的字符

由于
hexToAscii
返回的字符串的字符范围为128-255,因此这些字符将被编码为多个字节


解决方案不是将密钥视为字符串。字符串用于文本;加密密钥不是文本,而是字节序列。将加密密钥存储在字节数组中。
hexToAscii
应返回字节数组,而
encrypt
应只需在明文上调用
getBytes

调用
get的是什么Bytes()
你在说什么?你有几个。哪种编码?对
getBytes()的哪种调用
你说的是什么?你有几种。哪种编码?事实上,一个Java字符串是UTF-16,每个字符两个字节。根据十六进制值,它们可能不会转换为单个值。例如,第一个十六进制值cf是unicode字符的拉丁文大写字母l,带有diaeresis,Ï。这将转换为两个字节的UTF-8值C3 8F。谢谢。。。我最终将编码改为ISO-8859-1@user1397215那么您的代码仍然是错误的;正如我所说的,除了纯文本之外,您不应该使用
getBytes
。事实上,Java字符串是UTF-16,每个字符两个字节。根据十六进制值,它们可能不会转换为单个值。例如,第一个十六进制值cf是uni编码字符拉丁文大写字母l,带分音符,Ï。这将转换为两个字节的UTF-8值C3 8F。谢谢…我最终将编码改为ISO-8859-1@user1397215那么您的代码仍然是错误的;正如我所说的,除了纯文本之外,您不应该使用
getBytes