-1

バイト[]-文字列変換のために、一部のAESメッセージの暗号化と復号化に問題があります... a[9]!=c[9] (デバッグ時に違いを見ました)

try {

        String encryptionKey = "1234567890123456";
        String plaintext = "1234567890123456";

        System.out.println("key:   " + encryptionKey);
        System.out.println("plain:   " + plaintext);
        byte[] a = aes.encrypt(plaintext, encryptionKey);
        String b = new String(a);
        byte[] c = b.getBytes();

        String decrypted = new String(aes.decrypt(c, encryptionKey));

        System.out.println("decrypt: " + decrypted);

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


public byte[] encrypt(String plainText, String encryptionKey) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
    SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes(), "AES");
    cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes()));
    return cipher.doFinal(plainText.getBytes());
}
4

2 に答える 2

0

実際には、次のようにTCP接続を介してデータを送信したいのですが、まだ問題があります...サーバーから送信された文字列とクライアントから受信した文字列を比較しましたが、一致しません

サーバーは次のようになります。

public class server {
static String aeskey;
static String secret;
public static void main(String[] args) throws Exception {

AES aes = new AES();

    ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(1234);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 1234.");
        System.exit(1);
    }

    Socket clientSocket = null;
    try {
        clientSocket = serverSocket.accept();
    } catch (IOException e) {
        System.err.println("Accept failed.");
        System.exit(1);
    }

    PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    String int1,int2;

byte[] cipher = aes.encrypt("1234567890123456", "1234567890123456");
String s = new String(cipher , "ISO-8859-1");
out.println(s);

int1 = in.readLine();
System.out.println("From Client:"+int1);


    out.close();
    in.close();
    clientSocket.close();
    serverSocket.close();
}
}

クライアント (Android で試行) は次のようになります。

public class MainActivity extends Activity {

int cmd, ret;
public String IPAdress;
public String aeskey;
public String secret;
public Socket socket;
public PrintWriter out;
public BufferedReader in;
public AES aes = new AES();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Button b1 = (Button)findViewById(R.id.button1);

    cmd = 0;
    b1.setText("Connect to server");

    b1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(cmd == 0) ////setting-up the connection
            {
                int cs = connect_to_server();
                if(cs == 0)
                {
                    b1.setText("Connected");
                    try {
                        int dp  = do_protocol();
                    } catch (UnsupportedEncodingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    cmd = 1;
                    }
            }
            else 
            {
                ///to be edited later
            }
        }
    });

}

public int do_protocol() throws UnsupportedEncodingException
{
    int d = 0;
    BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
    String num1 = null,num2 = null;

    aeskey=aes.generateRandomString(16); ///generez o cheie AES

    try {
        num1 = in.readLine();
    } catch (IOException e1) {
        d = 1;
        e1.printStackTrace();
    }

    byte[] cipher = null;
    cipher = num1.getBytes("ISO-8859-1");
    try {
        num2 = new String(aes.decrypt(cipher, aeskey));
    } catch (Exception e) {
        d = 2;
        e.printStackTrace();
    }
    out.println(num2);

    return d;
}

public int connect_to_server()
{
    ret = 0;
    try {
        socket = new Socket("192.168.1.144", 1234);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (UnknownHostException e) {
        Toast.makeText(this, "Unable to connect to server", Toast.LENGTH_LONG).show();
        ret = 1;
        } catch (IOException e) {
        Toast.makeText(this, "Unable to connect to server", Toast.LENGTH_LONG).show();
        ret = 2;
        }
    if(ret == 0)
        Toast.makeText(this, "Connected to server", Toast.LENGTH_LONG).show();
    return ret;
}
于 2013-04-27T03:42:13.770 に答える
-1

byte[]これは、デフォルトのエンコーディングに適したバイトが含まれている場合にのみ機能します。たとえば、それがwindows-1251、またはUTF-8だとすると、ほとんどの ASCII 0 ~ 127 バイトは問題ありませんが、これより上のバイトはマングルまたは ? に変換されます。

String b = new String(a);
byte[] c = b.getBytes();

代わりに試す

String b = new String(a, "ISO-8859-1");
byte[] c = b.getBytes("ISO-8859-1");

「ISO-8859-1」エンコーディングは 0-255 を 0-255 に変換するため、元の情報が保持されます。

于 2013-04-26T15:44:26.073 に答える