我正在开发一个Android应用程序,我需要对使用ZXing应用程序生成的QRCode中的字节数组进行编码和解码.我的问题是我的消息解码与生成的字节数组不完全匹配.我尝试基于包含递增索引的字节数组创建QRCode,即
input = [0, 1, 2, ..., 124, 125, 126, 127, -128, -127,... -3, -2, -1, 0, 1, 2, ...]
Run Code Online (Sandbox Code Playgroud)
在对QRCode中的消息进行编码并在响应方侧对其进行解码后,我获得了以下字节数组输出:
output = [0, 1, 2, ..., 124, 125, 126, 127, 63, 63,... 63, 63, 63, 0, 1, 2, ...]
Run Code Online (Sandbox Code Playgroud)
所有"负"字节值都转为ASCII字符63:'?' 问号字符.我假设编码字符集出了问题,但由于我使用的是ISO-8859-1,每个人都声称是这类问题的解决方案(其他主题处理相同类型的问题或在这里),我不知道看看我的错误在哪里,或者我是否在编码或解码过程中跳过了一步.这是我执行以编码给定字节数组的代码:
String text = "";
byte[] res = new byte[272];
for (int i = 0; i < res.length; i++) {
res[i] = (byte) (i%256);
}
try {
text = new String(res, "ISO8859_1");
} catch (UnsupportedEncodingException …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android应用程序,我需要使用java Signature类进行数据身份验证.
在每台Android设备上,我都可以对数据进行签名并验证其签名.但是,给定一定数量的数据进行签名,一个明确的模数,一个明确的私有指数和一个明确的公共指数,我的签名输出会有所不同,具体取决于设备.我尝试使用大量设备,我获得了Android 3.2和3.2.1的相同签名,但是对于Android 2.2.x设备却有所不同.
我从以前KeyFactory在java项目中使用RSA 生成的常量字段计算这些签名.密钥大小为2048bit.
以下是我用于调用签名和验证的代码的引用.
public byte[] signData(byte[] data, PrivateKey privateKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data);
return signature.sign();
}
public boolean verifyData(byte[] data, byte[] sigBytes, PublicKey publicKey) throws ... {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(data);
return signature.verify(sigBytes);
}
Run Code Online (Sandbox Code Playgroud)
如果我没有误会,使用带有RSA的SHA256的签名是确定性的.那我怎么解释这样的行为呢?另一个有趣的问题是,我怎样才能使这项工作跨设备,即签名是相同的,不管我使用哪种设备?
先谢谢你,弗兰克!