zoukankan      html  css  js  c++  java
  • RSA

    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
    	byte[] keyByte=(Key)publicKey.getEncoded();
    	String key=Base64.getEncoder().encodeToString(keyByte); 
    
    String 转公钥对象
    	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
    	byte[] keyByte=(Key)privateKey.getEncoded();
    	String key=Base64.getEncoder().encodeToString(keyByte); 
    
    String转私钥
    	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的公钥进行加密

      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[]类型

    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);  //签名算法     
    signature.initSign(prkA);        
    signature.update(data);   
    signature.sign()返回签名byte[] 同上可转为字符串.
    
    • B用自己的私钥进行解密
      同加密过程 注意加密返回byte 解密也需要byte
    • 根据解密内容,及A的公钥进行验证
    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);        
    signature.initVerify(publicKey);        
    signature.update(data);   
    signature.verify(Base64.getDecoder().decode(sign)); 
    //注意验证时需提供解密内容,A的签名sign(注意String还是byte[]),以及A的公钥 返回boolean
    

  • 相关阅读:
    C# WinForm判断Win7下程序是否以管理员身份运行
    C#设置文件(夹)权限
    验证字符串是否为有效的IP地址
    内存对齐
    C#线程启动时传入参数
    写字符串内容到文件
    Thread.Abort() Is Evil.
    如何优雅地控制线程状态
    C#读取文件,返回字符串形式的文件内容
    关于产生不重复随机数的算法 C#
  • 原文地址:https://www.cnblogs.com/Dean0731/p/13659183.html
Copyright © 2011-2022 走看看