RSA为非对称加密,根据应用场景不同,分如下两种:
1.签名:使用私钥加密,公钥解密。用于验证私钥持有者的身份,防止私钥所有者发布的内容被篡改,但是公钥一般是公开的,所以无法保证加密内容不被其他人获得。
2.加密:公钥加密,私钥解密。加密内容无法被他人获得,但是信息可能被他人篡改伪造。
以下为Java中RSA算法的实现:
测试以上方法如下:
一般使用私钥签名,将签名内容一同发送给接收者验签,这样保证了发送者的身份有效性(服务器A给服务器B发送内容,使用服务器A的公钥私钥)。
如果公钥不对外暴露,服务器之间采用相互信任的机制,各自保留对方的公钥,那么可采取公钥加密私钥解密的方式(服务器A给服务器B发送内容,使用服务器B的公钥私钥)。
注:加解密参数及结果经常为字节数组,此时涉及字节数组与字符串的比较,那么就要转换类型。
String a转byte[] b为方法为a.getBytes(),getBytes()参数为编码类型,无参则使用环境编码(Charset.defaultCharset()查看当前系统编码),从jdk源码看,若编码不支持,则使用ISO-8859-1编码,建议制定兼容的UTF-8编码。
byte[] b转String a的方法为new String(b),同样可指定编码,切勿使用b.toString(),字节数组未覆盖Object的toString方法,toString()获得的是内存地址(也非实际物理地址,只是约定为getClass().getName() + “@” + Integer.toHexString(hashCode()))。
拓展
推荐一个Java工具类,功能强大,其中封装了各种加解密方法。简单测试其AES算法为
aes加解密encryptHex对应decryptStr,encrypt对应decrypt,以上key为工具类生成的,若自己指定key,则key必须为16、24、32位等,如下ct为毫秒级的Unix时间戳,只有13位,为凑足16位,随机加上3位,如”123”: