0

文字列を同等のASCII値に変換し、それを再び文字列またはcharに復号化する単純な暗号化プログラムを作成しようとしています。

import java.io.*; 
import javax.swing.*;

public class SimpleEncryption {
   public static void main (String [] args) throws Exception
  {
     BufferedReader inKb = new BufferedReader (new InputStreamReader (System.in));

     for(int i=0; i<10; i++)
     {
        String ans = JOptionPane.showInputDialog ("Hello User, would you like to encrypt or decrypt?");
        ans = ans.toUpperCase();        
        int a = 0;

        if (ans.contains("EN")||ans.contains("ENCRYPT"))
        {
           String pass = "";
           pass = JOptionPane.showInputDialog ("Please type your phrase into input:");          

           for (int j=0; j<pass.length(); j++)
           {
              char c = pass.charAt(j);
              a = (int) c;
              System.out.print(a);
           }
           break;
        }


        if (ans.contains("DE")||ans.contains("DECRYPT"))
        {
           String pass = "";
           pass = JOptionPane.showInputDialog ("Please type the encrypted code into input:");          

           for (int k=0; k<pass.length(); k++)
           {
              char c = pass.charAt(k);
              a = (int)(c);
              i = (char) a;
              System.out.print(a);
           }
           break;
        }

        System.out.println("Sorry I don't understand, please retry.");
     }
  }
}
4

2 に答える 2

2

あなたがしようとしているのが、実際に Java 文字列 (UTF-16 ベース) の ASCII でのエンコーディング (暗号化前?) である場合は、それをbase64でエンコードすることができます: このエンコーディング スキームはそのためだけに作成されました。

Java でこのエンコード/デコードを行うのは非常に簡単です (他の言語と同様)。

于 2012-09-03T17:01:50.593 に答える
1

必要と思われるのは、入力文字列のある種の文字エンコード(暗号化ではない)を表すバイト配列を取得することです。次に、エンコードされた文字の8進値を表示したいようです。US ASCIIが必要な場合は、177 8進数までのすべての(印刷可能な)文字を取得します。特殊文字が必要な場合は、より具体的な文字セットを選択する必要があります(IBM OEMまたはWestern-Latinが一般的な文字です)。UTF-8も使用できますが、1文字を複数バイトにエンコードする場合があります。

public static String toOctalString(final byte[] encoding) {
    final StringBuilder sb = new StringBuilder(encoding.length * 4);
    for (int i = 0; i < encoding.length; i++) {
        if (i != 0) {
            sb.append("|");
        }
        sb.append(Integer.toOctalString(encoding[i] & 0xFF));
    }
    return sb.toString();
}

public static byte[] fromOctalString(final String octalString) {
    final ByteArrayOutputStream baos = new ByteArrayOutputStream(octalString.length() / 4 + 1);
    final Matcher m = Pattern.compile("[0-7]{1,3}").matcher(octalString);
    while (m.find()) {
        baos.write(Integer.parseInt(m.group(), 8));
    }
    return baos.toByteArray();
}

public static void main(String[] args) {
    final String userInput = "owlstæd";
    // use the common Latin-1 encoding, standardized in ISO 8859 as character set 1
    // you can replace with ASCII, but the ASCII characters will encode fine for both
    final byte[] userInputEncoded = userInput.getBytes(Charset.forName("ISO8859-1"));
    final String octalString = toOctalString(userInputEncoded); 
    System.out.println(octalString);

    final byte[] userInputEncoded2 = fromOctalString(octalString);
    final String userInput2 = new String(userInputEncoded2, Charset.forName("ISO8859-1"));
    System.out.println(userInput2);
}
于 2012-09-03T23:17:06.237 に答える