解密时奇怪的字符串格式

时间:2016-12-04 10:18:56

标签: java encryption

我正在尝试编写一个小挑战响应应用程序。我的想法是输入一个文本,加密它,将其显示为QR码,以便另一方可以扫描它,解密它并向我显示原始文本。但最终文本是一种奇怪的格式,我无法弄清楚什么是错的。这就是我现在正在做的事情:

'challenge'字符串是TextView

中的文本
byte[] secret = encrypt(publicKey, challenge.getBytes(StandardCharsets.UTF_8));
challengeenc = bytes2String(secret);

public byte[] encrypt(PublicKey key, byte[] plaintext) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException
{
    Cipher enc = Cipher.getInstance("RSA");
    enc.init(Cipher.ENCRYPT_MODE, key);
    return enc.doFinal(plaintext);
}

private static String bytes2String(byte[] bytes)
{
    StringBuilder string = new StringBuilder();
    for (byte b : bytes) {
        String hexString = Integer.toHexString(0x00FF & b);
        string.append(hexString.length() == 1 ? "0" + hexString : hexString);
    }
    return string.toString();
}

然后QR码部分进行转换和读取,但这也必须工作,因为challengeenc等于我用QR码扫描器读取的字符串(挑战)

byte[] loesung = decrypt(privateKey, challenge.getBytes());
loesungstr = bytes2String(loesung);

现在的loesungstr应等于我开始但现在我进入了“AAAAAAAA”字符串和loesungstr是:“1a3e3aa2e6a804fe6035c3f2879219ff971f119dee7e513f9311a27c3e7a7d58a27f826c45c5ace3699bc11ce7176a1ee3c9f4c1190402af5a79bbd8944750c85e73e4cda459ff904156186e1c010ea861a8f0be78594c00e22d049213b381de8afd877877ae9cf59169c77f088fe552a0e552260ed68f599858eaf1585916128778758db5c6d8efe32844d208932289f86202c10485533cdd89f1bd08d6e86f81c201d7d707ba435a5472a36cd7dc7584156000004b4a7a8fa320d3f3a919f9f901d86b965ba09a452372fd35cf84fc3a1841c18196c735c76b2ce75bf8bd03a671d42f6c0bac39eabf56ea09b37d00176f1b45a3917f81226ef2f0a312e515”

我尝试了很多东西并将这个字符串从十六进制转换为字符串,从十六进制转换为ASCII,......但我无法弄清楚它出错的地方..

有人知道这个字符串可能是什么吗?

PS:因为我可以签署文本并验证签名,所以我知道我创建的密钥对是正确的

1 个答案:

答案 0 :(得分:0)

你应该有另一种解码编码字符串的方法,即hexStringToByteArray()在解密之前:

此方法来自此answer

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

并在解密时使用它,如下所示:

byte[] loesung = decrypt(privateKey, hexStringToByteArray(challenge));

获取原始纯文本:

String plaintext = new String(loesung);