1

長い文字列を取り込んで、次のコードを使用して暗号化しようとしています。

import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;

public class AESEncrypt {

    /**
     * Turns array of bytes into string
     * 
     * @param buf
     *            Array of bytes to convert to hex string
     * @return Generated hex string
     */
    public static String asHex(byte buf[]) {
        StringBuffer strbuf = new StringBuffer(buf.length * 2);
        int i;

        for (i = 0; i < buf.length; i++) {
            if (((int) buf[i] & 0xff) < 0x10)
                strbuf.append("0");

            strbuf.append(Long.toString((int) buf[i] & 0xff, 16));
        }

        return strbuf.toString();
    }

    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character
                    .digit(s.charAt(i + 1), 16));
        }
        return data;
    }

    public static void main(String[] args) throws Exception {

        String message = "Test text!";

        // Get the KeyGenerator
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128); // 192 and 256 bits may not be available

        // Generate the secret key specs.
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();

        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        System.out.println("Key: " + asHex(raw));

        // Instantiate the cipher

        Cipher cipher = Cipher.getInstance("AES");

        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        byte[] encrypted = cipher.doFinal((args.length == 0 ? message : args[0]).getBytes());
        System.out.println("encrypted string: " + asHex(encrypted));

    }
}

ただし、単語ごとに暗号化し、暗号化されたテキストを次のように印刷したいと思います。

元の文字列->テストテキスト!

暗号化された文字列->29f84h2f23f9f92jf3

私を助けることができる例をオンラインで見つけることができませんでした。とにかく私はこれを達成することができますか?

4

2 に答える 2

0

AES はブロック暗号であり、16 バイト ブロックを使用します。言葉では機能しませんが、固定ブロックで機能します。テキストをさまざまなサイズの単語に分割したい場合は、RC4 などのストリーム暗号を使用するか、代わりに AES を効果的にストリーム暗号に変換する CTR モードの AES を使用することで、目的に近づく可能性があります。ストリーム暗号はブロック単位ではなく、バイト単位で機能します。3 文字の単語の場合はストリームから 3 バイト、9 文字の単語の場合はストリームから 9 バイトを取ることができます。

単語間のスペースや句読点などをどうするかを考える必要があります。また、暗号のキーを変更する頻度についても考慮する必要があります。個々の単語ごとにキーを再設定しますか?それとも、各文字列の先頭でキーを再設定しますか? 他のストリーム サイファーと同様に、同じキーを 2 回使用しないでください。

于 2012-07-27T11:32:39.140 に答える
0

以下の例を試してください。実際には、StringTokenizer を使用するだけで済みます。まず、ターゲット文字列をトークン化する必要があります。その後、トークン文字列を暗号化します。

import java.util.StringTokenizer;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class AES {
    public static String asHex(byte[] buf) {
        StringBuffer strbuf = new StringBuffer(buf.length * 2);
        int i;

        for (i = 0; i < buf.length; i++) {
            if (((int)buf[i] & 0xff) < 0x10)
                strbuf.append("0");
            strbuf.append(Long.toString((int)buf[i] & 0xff, 16));
        }

        return strbuf.toString();
    }

    public static void main(String[] args) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance("AES");
        kgen.init(128); // 192 and 256 bits may not be available
        // Generate the secret key specs.
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();

        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);

        String target = "This is just an example";
        StringTokenizer token = new StringTokenizer(target);
        while(token.hasMoreTokens()) {
            String temp = token.nextToken();
            byte[] encrypted = cipher.doFinal((args.length == 0 ?  temp : args[0]).getBytes());
            System.out.println(asHex(encrypted) + " ");
        }
    }
}

出力:

    d40186eab04d10e299801e7ad9046c06 6a71265c768a3b6e1f1a8f891d621c1d 735e3f54c8ad7242466e3517e8dd1659 5216643345db0f0c12f65c66c5363be3 b823355d5bb31bf092df98e18fa8001c
于 2012-09-18T11:12:13.017 に答える