-1

指定されたプレーンテキストを暗号化するために使用される、またはその逆に使用される事前に作成されたコードがあります。

クラスには 3 つのメソッドがあり、2 つのメソッドはそれぞれ暗号化と復号化に使用できます。

public class SqlCipherUtil {

    private Cipher ecipher;
    private Cipher dcipher;

    public String encryptString(String pStrPlainText) {

        try {
            generateKey();
            byte[] utf8 = pStrPlainText.getBytes("UTF8");
            byte[] enc = this.ecipher.doFinal(utf8);
            return new BASE64Encoder().encode(enc);

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

        return null;
    }

    public String decryptString(String pStrCipherText){

        try {
            generateKey();
            byte[] dec = new BASE64Decoder().decodeBuffer(pStrCipherText);
            byte[] utf8 = this.dcipher.doFinal(dec);
            return new String(utf8, "UTF8");

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

        return null;
    }

    /**
     * This method is used to generate the encrypted key.
     */
    private void generateKey() {

        try {
            byte[] decodedStr = new BASE64Decoder().decodeBuffer("rA/LUdBA/hA=");
            SecretKey key = new SecretKeySpec(decodedStr, "DES");
            this.ecipher = Cipher.getInstance("DES");
            this.dcipher = Cipher.getInstance("DES");
            this.ecipher.init(1, key);
            this.dcipher.init(2, key);

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

クラスに存在するキーは、行内の他のキーに変更できずbyte[] decodedStr = new BASE64Decoder().decodeBuffer("rA/LUdBA/hA=");、例外が発生しています。

java.security.InvalidKeyException: Invalid key length: 9 bytes
    at com.sun.crypto.provider.DESCipher.engineGetKeySize(DashoA13*..)
    at javax.crypto.Cipher.b(DashoA13*..)
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)

以下のコードを試してみましたが、配列に正確に 8 バイトが含まれています。

    public static void main(String[] args) throws IOException {
        byte[] decodedStr = new BASE64Decoder().decodeBuffer("rA/LUdBA/hA=");

        for(byte b : decodedStr){
            System.out.print(b);
            System.out.print(" ");
        }
    }

}

キーのその他の組み合わせは、バイト配列のサイズを 8 より大きくするか、7 より小さくします。

バイト配列サイズ 8 を取得する背後にある概念は何ですか?

カスタムキーの組み合わせまたはカスタム生成キーを使用するにはどうすればよいですか?

両方の質問に答えてください。

4

3 に答える 3

2

キーのその他の組み合わせにより、バイト配列のサイズが8より大きくなるか7より小さくなります。

私はそれを疑います。おそらく間違った文字を追加または削除しています。または間違った位置にあります。参照: http: //en.wikipedia.org/wiki/Base64

はい、9バイトはDESの有効なキー長ではありません。あなたは単にそれを適切な長さに短くすることができます。base64文字列の長さが3x4文字であり、3x3 = 9文字にデコードされるため、9バイトになります。出力をトリミングします。

バイト配列サイズ8を取得する背後にある概念は何ですか?

DESは56ビットキーを使用します。8バイト=64ビットなので、キーに十分なビット。

カスタムキーの組み合わせまたはカスタム生成されたキーを使用するにはどうすればよいですか?

ユーザーが7文字(56ビット)以上のキーを入力できるようにします。このサンプルでbase64を使用する理由がまったくわかりません。おそらく、どこかからコピーしたからでしょう。必要なのはランダムなバイト数バイトだけです。それらを取得する一般的な方法は、ユーザーが入力した任意の入力からハッシュを作成し、そのハッシュからバイトを使用することです。

于 2012-09-25T08:03:36.413 に答える
0

ターゲットが文字列をエンコードおよびデコードする場合は、を使用しBase64ます。

    public class PasswordCodecHandler {
        Base64 codec = null;

        public PasswordCodecHandler() {
            codec = new Base64();
        }

        public String encode(String password) {
            byte[] temp;
            String encodedPassword = null;
            temp = codec.encode(password.getBytes());
            encodedPassword = new String(temp);
            return encodedPassword;
        }

        public String decode(byte[] encodedPassword) {
            byte[] temp;
            String decodedPassword;
            temp = codec.decode(encodedPassword);
            decodedPassword = new String(temp);
            return decodedPassword;
        }

        public static void main(String[] args) {
            PasswordCodecHandler passwordCodecHandler = new PasswordCodecHandler();
            String s1 = passwordCodecHandler.encode("password");
            System.out.println(s1);

            String s2 = passwordCodecHandler.encode("admin");
            System.out.println(s2);

            String s3 = passwordCodecHandler.encode("administrator");
            System.out.println(s3);

            String s4 = passwordCodecHandler.encode("123456");
            System.out.println(s4);

        }
    }

他のデータ型の場合:java.lang.OutOfMemoryErrorメモリ割り当てサイズに基づく場合があります

    /* Download apache common-io.xxx. jar*/

    public class CodecHandler {
        Base64 codec = null;

        public CodecHandler() {
            codec = new Base64();
        }

        public byte[] encode(byte[] decoded) {
            return codec.encode(decoded);
        }

        public byte[] decode(byte[] encoded) {
            return codec.decode(encoded);
        }

        public static void main(String[] args) throws IOException {
            File file = new File("D:/Test.mp4");
            byte[] fileByteArray = FileUtils.readFileToByteArray(file);
            CodecHandler codecHandler = new CodecHandler();
            byte[] encoded = codecHandler.encode(fileByteArray);
            System.out.println("Byte Size : " + encoded.length);
            byte[] decode = codecHandler.decode(encoded);
            FileUtils.writeByteArrayToFile(new File("C:/Test.mp4"), decode);


        }
    }
于 2012-09-25T08:23:50.950 に答える