0

これを投稿するのは初めてなので、あまり私を責めないでください (ただし、私はこのフォーラムをかなり前から読んでいます)。

Java で AES を使用して遭遇する問題は、次のようなものです。

まず、文字列を暗号化してテキスト ファイルに書き込んで圧縮する必要がありますが、これは問題ありません。私は AES 暗号化を使用しており、「123」などの独自のキーを定義しています。

次に、ファイルを解凍 (または解凍) し、最初のステップで使用したのと同じキーを使用して復号化する必要があります。

ここで何が起こるか:最初のステップは良いですが、文字列の結果が同じ、合計文字、単語などであっても、2番目のステップはファイルの復号化に失敗しました

ファイルを書き込むコードは次のとおりです

private static void inputKeFile(String input) throws IOException
{
    FileWriter fstream = new FileWriter("C:/Users/Sactio/Desktop/tyo/txtToZip.txt",false);
    BufferedWriter out = new BufferedWriter(fstream);
    out.write(input);
    //Close the output stream
    out.close();
}

ファイルを圧縮するには

private static void doZip() {
        try {

            String filename ="C:/Users/Sactio/Desktop/tyo/txtToZip.txt";
            String zipfilename="C:/Users/Sactio/Desktop/OutputZipWrite";
            File file = new File(filename);
            FileInputStream fis = new FileInputStream(file);
            long length = file.length();
            byte[] buf = new byte[(int)length];
            fis.read(buf,0,buf.length);

            CRC32 crc = new CRC32();
            ZipOutputStream s = new ZipOutputStream(new FileOutputStream(zipfilename));

            s.setLevel(9);

            ZipEntry entry = new ZipEntry(filename);
            entry.setSize((long)buf.length);
            crc.reset();
            crc.update(buf);
            entry.setCrc( crc.getValue());
            s.putNextEntry(entry);
            s.write(buf, 0, buf.length);
            s.finish();
            s.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

これが暗号化です

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

public class JcaTest {  
private Cipher ecipher;  
private Cipher dcipher;  

JcaTest(SecretKey key) {  
    try {  
        ecipher = Cipher.getInstance("AES");  
        dcipher = Cipher.getInstance("AES");  
        ecipher.init(Cipher.ENCRYPT_MODE, key);  
        dcipher.init(Cipher.DECRYPT_MODE, key);  
    } catch (Exception e) {  
        System.out.println("Failed in initialization");  
    }  
}  

public String encrypt(String str) {  
    try {  
        byte[] utf8 = str.getBytes("UTF-8");  
        byte[] enc = ecipher.doFinal(utf8);  

        return new sun.misc.BASE64Encoder().encode(enc);  
    } catch (Exception e) {  
        System.out.println("Failed in Encryption");  
    }  
    return null;  
}  

public String decrypt(String str) {  
    try {  
        byte[] dec = new sun.misc.BASE64Decoder().decodeBuffer(str);  

        byte[] utf8 = dcipher.doFinal(dec);  

        return new String(utf8, "UTF-8");  
    } catch (Exception e) {  
        System.out.println("Failed in Decryption");  
    }  
    return null;  
}  

最後に、zip のエクストラクター

private static void bacaZip(String zipfilename) throws IOException
{

    ZipInputStream zinstream = new ZipInputStream(
     new FileInputStream(zipfilename));


    File file = new File(zipfilename);
    FileInputStream fis = new FileInputStream(file);
    long length = file.length();
    byte[] buf = new byte[(int)length];

    ZipEntry zentry = zinstream.getNextEntry();
    System.out.println("Name of current Zip Entry : " + zentry + "\n");
    while (zentry != null) {
      String entryName = zentry.getName();
      System.out.println("Name of  Zip Entry : " + entryName);
      FileOutputStream outstream = new FileOutputStream("C:/Users/Sactio/Desktop/OutputZipWrite.txt");
      int n;

      while ((n = zinstream.read(buf, 0, buf.length)) > -1) {
        outstream.write(buf, 0, n);

      }
      System.out.println("Successfully Extracted File Name : "
          + entryName);
      outstream.close();

      zinstream.closeEntry();
      zentry = zinstream.getNextEntry();

    }
}

private static void extractZip(String jsonString) throws FileNotFoundException
{

    try {
        bacaZip(jsonString);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        System.err.println("Exception: "+e1);
    }
    StringBuffer contents = new StringBuffer();
    BufferedReader reader = null;

    try {
        reader = new BufferedReader(new FileReader("C:/Users/Sactio/Desktop/OutputZipWrite.txt"));
        String text = null;

        // repeat until all lines is read
        while ((text = reader.readLine()) != null) {
            contents.append(text)
                    .append(System.getProperty(
                            "line.separator"));
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // show file contents here
    System.out.println("HASIL: "+contents.toString());
}

圧縮とファイルの手順をスキップすると、AES はうまく機能しますが、文字列をファイルに送信して圧縮すると、何らかの理由で AES 暗号化が失敗します。誰でもこの問題について何か考えがありますか?

4

1 に答える 1

1

復号化するファイルは、暗号化プロセスからの出力と同じバイト単位である必要があります。「文字列の結果は同じですが、合計文字、単語などです」とあなたは言いますが、これは暗号化されたファイルをテキスト「文字」として扱っていることを示しています。テキストではなく、バイトです文字をバイトとして表現するにはさまざまな方法があるため、文字をテキストとして扱うことは災害のレシピです。バイトごとの同一性をチェックし、常に暗号文を文字ではなくバイトとして扱う必要があります。

@Thilo が指摘したように、暗号化されたデータを圧縮しても意味がありません。圧縮 -> 暗号化 -> 復号化 -> 展開のシーケンスを使用します。

于 2012-06-20T12:09:39.627 に答える