0

このサイトでユーザーが提供するサンプル コードを使用しました。パスワードを暗号化し、将来の使用のためにファイルに保存する必要があります。ユーザーがシステムを使用しようとすると、ファイルからパスワードを取得し、それを復号化して、さらに処理するために使用します。そのため、暗号化/復号化リクエストごとに異なるキーを使用することはできません。そのため、KeyGenerator.generateKey() を呼び出す代わりに、固定の byte[] を使用してキーを格納します。以下は完全なコードです。

public class App 
{
    static byte[] seckey=null;
    static
    {
        try
        {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
              kgen.init(128); 

                        // Generate the secret key specs.             
                        // SecretKey skey = kgen.generateKey();
                        // seckey = skey.getEncoded();
                        // above won't work as can't generate new secret key for decrypt. Have to use same key for encrypt and decrypt

                        // seckey = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};
                        seckey = new byte[]{(byte)172,(byte)236,(byte)125,(byte)222,(byte)188,(byte)33,(byte)210,(byte)4,(byte)202,(byte)31,(byte)188,(byte)152,(byte)220,(byte)104,(byte)62,(byte)64};


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


    }
    public static void main( String[] args )
    {   

        String password = encrypt("A123456"); //working
        System.out.println(password);
        System.out.println(decrypt(password));

        String password = encrypt("A*501717"); //NOT working
        System.out.println(password);
        System.out.println(decrypt(password));

    }    
    public static String encrypt(String passwd)
    {
        SecretKeySpec key = new SecretKeySpec(seckey, "AES");
        byte[] output;
        try
        {
            Cipher cipher = Cipher.getInstance("AES");

            // encryption pass
            cipher.init(Cipher.ENCRYPT_MODE, key);
            output = cipher.doFinal(passwd.getBytes());
        } catch (Exception e)
        {
            System.out.println("Unable to encrypt password.");
            output = "".getBytes();
        }

        return new String(output);

    }

    public static String decrypt(String passwd)
    {
        if (!StringUtils.isNotBlank(passwd))
            return "";

            SecretKeySpec key = new SecretKeySpec(seckey, "AES");

        byte[] output;
        try
        {
            Cipher cipher = Cipher.getInstance("AES");
            // decryption pass
            cipher.init(Cipher.DECRYPT_MODE, key);
            output = cipher.doFinal(passwd.getBytes());
        } catch (Exception e)
        {
            System.out.println("Unable to decrypt password");
            output = "".getBytes();
        }

        return new String(output);

    }
   }

問題は、ほとんどの場合は機能しますが、特定の文字シーケンスでは復号化に失敗することです。たとえば、現在 A123456 では機能していません。次に、秘密鍵を以下に変更しました

seckey = new byte[]{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f};

その後、A123456 では機能しましたが、A*3qwe では失敗しました (これは以前の秘密鍵で機能していました。そのため、一部のデータでのみ機能しない理由を完全に理解できませんか?

誰かが私を助けてくれませんか?

4

1 に答える 1

0

Base64Encoder を使用してこの問題を解決しました。基本的に暗号化されたデータには、通常の txt ファイルに格納できない文字が含まれている可能性があるため、復号化に失敗します。そこで、Base64Encoder を使用して暗号化された文字列をエンコードしました。このエンコードされた文字は通常の ASCII 文字であり、txt ファイルに簡単に保存できます。元のデータを取得するには逆のことが必要です。つまり、ファイルに保存されている文字列を最初にデコードしてから復号化します。

于 2012-06-18T07:15:47.210 に答える