RSA
非对称加密算法的一种 - 随意选择两个大的质数p和q,p不等于q,计算N=pq。 - 根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1)。 - 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。 - 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。 (d\*e)%((p-1)(q-1))=1 - 将p和q的记录销毁。 - 以上内容中,(N,e)是公钥,(N,d)是私钥。 ###### 公钥对象转为String \`\`\`java byte\[\] keyByte=(Key)publicKey.getEncoded(); String key=Base64.getEncoder().encodeToString(keyByte); \`\`\` ###### String 转公钥对象 \`\`\`java byte\[\] keyBytes = Base64.getDecoder().decode(key); //衔接 先转换byte\[\] X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); //RSA算法 Key publicK = keyFactory.generatePublic(x509KeySpec); \`\`\` ###### 私钥转String \`\`\`java byte\[\] keyByte=(Key)privateKey.getEncoded(); String key=Base64.getEncoder().encodeToString(keyByte); \`\`\` ###### String转私钥 \`\`\`java byte\[\] keyBytes = Base64.getDecoder().decode(key); //先转换byte\[\] PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); \`\`\` ##### 例:有A,B两人每人一对秘钥 prkA,pukA,prkB,pukB,A向B发送信息 - A用B的公钥进行加密 \`\`\`java Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, pukB); byte\[\]data = cipher.doFinal(data, 0, data.length()); //加密后数据(全为数字),encodetoString()转为字符, //注:也可以循环分段加密,需添加流,每段为一个byte\[\],写入流中(ByteArrayOutputStream),最后读出流中byte\[\] \`\`\` - A用A的私钥进行签名(写上名字) 注:sign为byte\[\]类型 \`\`\`java Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); //签名算法 signature.initSign(prkA); signature.update(data); signature.sign()返回签名byte\[\] 同上可转为字符串. \`\`\` - B用自己的私钥进行解密 同加密过程 注意加密返回byte\[\](可转化string) 解密也需要byte\[\](注意进行转换) - 根据解密内容,及A的公钥进行验证 \`\`\`java Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(publicKey); signature.update(data); signature.verify(Base64.getDecoder().decode(sign)); //注意验证时需提供解密内容,A的签名sign(注意String还是byte\[\]),以及A的公钥 返回boolean \`\`\`