static String getPubExp() throws Exception {
return (new String(Base64.encode(pubExp.toByteArray())));
}
保护您的J2ME/MIDP应用程序(8)
时间:2011-01-07 IBM Michael Juntao Yuan
通过使用生成的私钥,实用程序类 RSASigUtil 可以从摘要获取一个字节数组 RSA 签名:
清单 15. 获取字节数组 RSA 签名
static public String getSignature (String mesg) throws Exception {
SHA1Digest digEng = new SHA1Digest();
RSAEngine rsaEng = new RSAEngine();
PSSSigner signer = new PSSSigner(rsaEng, digEng, 64);
signer.init(true, privKey);
byte [] sig = signer.generateSignature( mesg.getBytes() );
String result = new String( Base64.encode(sig) );
return result;
}
服务器将摘要、签名和密钥参数编码成 ASCII 文本格式并以 XML 数字签名格式嵌入该文本:
清单 16. 编码并以数字签名格式嵌入
<SignedMesg>
<mesg>Hello World</mesg>
<Signature>
<SignedInfo>
<SignatureMethod Algorithm="rsa-sha1" />
<DigestValue>Ck1VqNd45QIvq3AZd8XYQLvEhtA=</DigestValue>
</SignedInfo>
<SignatureValue>
IhJ/UMitJX7sWbzhnG8UKIdDYiZ0mfOUoAwemGiG08C
WcQ3cUszgJXoIclHW/LN7w54w2FQyLStB+hPKASEC6r
OjjgTBs6pwhjHCh2XxWx7hS7fdi9/Qk/ybH6xYGaeaZ
3oHDBjFz3hEDtrvBYcHn3keCavncE22idRX7kBl8Do=
</SignatureValue>
<KeyInfo>
<KeyValue>
<RSAKeyValue>
<Modulus>
AKT1SyxSm4uT1zYWEPY9IaFY7vDhpkIM7FZeIQ
OGnKeSEE5d3sPfONkCiHfO2oe4x6jNCXg/ngRi
tmixBkjfKgHzF4trZZtNQZjfzAgcXGljzp9MD2
ZEWQbHKvMZvZyJVrT2SlxLzusxWLwXdacprIDG
bqDAmldBOBpkmrUdPpF9
</Modulus>
<Exponent>EQ==</Exponent>
</RSAKeyValue>
</KeyValue>
</KeyInfo>
</Signature>
</SignedMesg>
保护您的J2ME/MIDP应用程序(9)
时间:2011-01-07 IBM Michael Juntao Yuan
验证 MIDP 应用程序从 XML 文档解析出摘要、密钥参数和签名,重新构造公钥并使用下列方法来验证签名:
清单 17. 验证签名
static public boolean verify (String mesg, String signature,
String mod, String pubExp) {
BigInteger modulus = new BigInteger( Base64.decode(mod) );
BigInteger exponent = new BigInteger( Base64.decode(pubExp) );
SHA1Digest digEng = new SHA1Digest();
RSAEngine rsaEng = new RSAEngine();
RSAKeyParameters pubKey = new RSAKeyParameters(false, modulus, exponent);
PSSSigner signer = new PSSSigner(rsaEng, digEng, 64);
signer.init(false, pubKey);
boolean res = signer.verifySignature( mesg.getBytes(),
Base64.decode(signature) );
return res;
}
性能问题
我的测试说明了无线设备上的 XML 解析和摘要生成都非常快。正如预料的那样,主要的性能瓶颈是公钥算法的速度很慢。
Bouncy Castle Crypto 包提供几个使用 DSA、RSA 和 ECC 算法的签名引擎类来签署和验证消息。但在实际设备中,它们并不都是实用的。因为 Bouncy Castle Crypto 包完全基于Java 语言,所以它在没有特殊优化的 |