乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      用javascript與java進(jìn)行RSA加密與解密

       WindySky 2009-03-19

      用javascript與java進(jìn)行RSA加密與解密

      具體實(shí)現(xiàn)思路如下:

      1。服務(wù)端生成公鑰與私鑰,保存。

      2??蛻舳嗽谡?qǐng)求到登錄頁(yè)面后,隨機(jī)生成一字符串。

      3。后此隨機(jī)字符串作為密鑰加密密碼,再用從服務(wù)端獲取到的公鑰加密生成的隨機(jī)字符串。

      4。將此兩段密文傳入服務(wù)端,服務(wù)端用私鑰解出隨機(jī)字符串,再用此私鑰解出加密的密文。

      這其中有一個(gè)關(guān)鍵是解決服務(wù)端的公鑰,傳入客戶端,客戶端用此公鑰加密字符串后,后又能在服務(wù)端用私鑰解出。

      此文即為實(shí)現(xiàn)此步而作。

      加密算法為RSA:

      1。服務(wù)端的RSA  java實(shí)現(xiàn)。

      Java代碼 

      package com.castscs.util;

      import java.io.ByteArrayOutputStream;  
      import java.io.FileInputStream;  
      import java.io.FileOutputStream;  
      import java.io.ObjectInputStream;  
      import java.io.ObjectOutputStream;  
      import java.math.BigInteger;  
      import java.security.KeyFactory;  
      import java.security.KeyPair;  
      import java.security.KeyPairGenerator;  
      import java.security.NoSuchAlgorithmException;  
      import java.security.PrivateKey;  
      import java.security.PublicKey;  
      import java.security.SecureRandom;  
      import java.security.interfaces.RSAPrivateKey;  
      import java.security.interfaces.RSAPublicKey;  
      import java.security.spec.InvalidKeySpecException;  
      import java.security.spec.RSAPrivateKeySpec;  
      import java.security.spec.RSAPublicKeySpec;  
      import javax.crypto.Cipher;  
      /** 
      * RSA 工具類。提供加密,解密,生成密鑰對(duì)等方法。 
      * 需要到http://www.下載bcprov-jdk14-123.jar。 
      *  
      */ 
      public class RSAUtil {  
          /** 
           * * 生成密鑰對(duì) * 
           *  
           * @return KeyPair * 
           * @throws EncryptException 
           */ 
          public static KeyPair generateKeyPair() throws Exception {  
              try {  
                  KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA",  
                          new org.bouncycastle.jce.provider.BouncyCastleProvider());  
                  final int KEY_SIZE = 1024;// 沒什么好說的了,這個(gè)值關(guān)系到塊加密的大小,可以更改,但是不要太大,否則效率會(huì)低  
                  keyPairGen.initialize(KEY_SIZE, new SecureRandom());  
                  KeyPair keyPair = keyPairGen.generateKeyPair();  
                  saveKeyPair(keyPair);  
                  return keyPair;  
              } catch (Exception e) {  
                  throw new Exception(e.getMessage());  
              }  
          }  
          public static KeyPair getKeyPair()throws Exception{  
              FileInputStream fis = new FileInputStream("C:/RSAKey.txt");  
               ObjectInputStream oos = new ObjectInputStream(fis);  
               KeyPair kp= (KeyPair) oos.readObject();  
               oos.close();  
               fis.close();  
               return kp;  
          }  
          public static void saveKeyPair(KeyPair kp)throws Exception{  
               FileOutputStream fos = new FileOutputStream("C:/RSAKey.txt");  
               ObjectOutputStream oos = new ObjectOutputStream(fos);  
               //生成密鑰  
               oos.writeObject(kp);  
               oos.close();  
               fos.close();  
          }  
          /** 
           * * 生成公鑰 * 
           *  
           * @param modulus * 
           * @param publicExponent * 
           * @return RSAPublicKey * 
           * @throws Exception 
           */ 
          public static RSAPublicKey generateRSAPublicKey(byte[] modulus,  
                  byte[] publicExponent) throws Exception {  
              KeyFactory keyFac = null;  
              try {  
                  keyFac = KeyFactory.getInstance("RSA",  
                          new org.bouncycastle.jce.provider.BouncyCastleProvider());  
              } catch (NoSuchAlgorithmException ex) {  
                  throw new Exception(ex.getMessage());  
              }  
              RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(  
                      modulus), new BigInteger(publicExponent));  
              try {  
                  return (RSAPublicKey) keyFac.generatePublic(pubKeySpec);  
              } catch (InvalidKeySpecException ex) {  
                  throw new Exception(ex.getMessage());  
              }  
          }  
          /** 
           * * 生成私鑰 * 
           *  
           * @param modulus * 
           * @param privateExponent * 
           * @return RSAPrivateKey * 
           * @throws Exception 
           */ 
          public static RSAPrivateKey generateRSAPrivateKey(byte[] modulus,  
                  byte[] privateExponent) throws Exception {  
              KeyFactory keyFac = null;  
              try {  
                  keyFac = KeyFactory.getInstance("RSA",  
                          new org.bouncycastle.jce.provider.BouncyCastleProvider());  
              } catch (NoSuchAlgorithmException ex) {  
                  throw new Exception(ex.getMessage());  
              }  
              RSAPrivateKeySpec priKeySpec = new RSAPrivateKeySpec(new BigInteger(  
                      modulus), new BigInteger(privateExponent));  
              try {  
                  return (RSAPrivateKey) keyFac.generatePrivate(priKeySpec);  
              } catch (InvalidKeySpecException ex) {  
                  throw new Exception(ex.getMessage());  
              }  
          }  
          /** 
           * * 加密 * 
           *  
           * @param key 
           *            加密的密鑰 * 
           * @param data 
           *            待加密的明文數(shù)據(jù) * 
           * @return 加密后的數(shù)據(jù) * 
           * @throws Exception 
           */ 
          public static byte[] encrypt(PublicKey pk, byte[] data) throws Exception {  
              try {  
                  Cipher cipher = Cipher.getInstance("RSA",  
                          new org.bouncycastle.jce.provider.BouncyCastleProvider());  
                  cipher.init(Cipher.ENCRYPT_MODE, pk);  
                  int blockSize = cipher.getBlockSize();// 獲得加密塊大小,如:加密前數(shù)據(jù)為128個(gè)byte,而key_size=1024  
                  // 加密塊大小為127  
                  // byte,加密后為128個(gè)byte;因此共有2個(gè)加密塊,第一個(gè)127  
                  // byte第二個(gè)為1個(gè)byte  
                  int outputSize = cipher.getOutputSize(data.length);// 獲得加密塊加密后塊大小  
                  int leavedSize = data.length % blockSize;  
                  int blocksSize = leavedSize != 0 ? data.length / blockSize + 1 
                          : data.length / blockSize;  
                  byte[] raw = new byte[outputSize * blocksSize];  
                  int i = 0;  
                  while (data.length - i * blockSize > 0) {  
                      if (data.length - i * blockSize > blockSize)  
                          cipher.doFinal(data, i * blockSize, blockSize, raw, i  
                                  * outputSize);  
                      else 
                          cipher.doFinal(data, i * blockSize, data.length - i  
                                  * blockSize, raw, i * outputSize);  
                      // 這里面doUpdate方法不可用,查看源代碼后發(fā)現(xiàn)每次doUpdate后并沒有什么實(shí)際動(dòng)作除了把byte[]放到  
                      // ByteArrayOutputStream中,而最后doFinal的時(shí)候才將所有的byte[]進(jìn)行加密,可是到了此時(shí)加密塊大小很可能已經(jīng)超出了  
                      // OutputSize所以只好用dofinal方法。  
                      i++;  
                  }  
                  return raw;  
              } catch (Exception e) {  
                  throw new Exception(e.getMessage());  
              }  
          }  
          /** 
           * * 解密 * 
           *  
           * @param key 
           *            解密的密鑰 * 
           * @param raw 
           *            已經(jīng)加密的數(shù)據(jù) * 
           * @return 解密后的明文 * 
           * @throws Exception 
           */ 
          public static byte[] decrypt(PrivateKey pk, byte[] raw) throws Exception {  
              try {  
                  Cipher cipher = Cipher.getInstance("RSA",  
                          new org.bouncycastle.jce.provider.BouncyCastleProvider());  
                  cipher.init(cipher.DECRYPT_MODE, pk);  
                  int blockSize = cipher.getBlockSize();  
                  ByteArrayOutputStream bout = new ByteArrayOutputStream(64);  
                  int j = 0;  
                  while (raw.length - j * blockSize > 0) {  
                      bout.write(cipher.doFinal(raw, j * blockSize, blockSize));  
                      j++;  
                  }  
                  return bout.toByteArray();  
              } catch (Exception e) {  
                  throw new Exception(e.getMessage());  
              }  
          }  
          /** 
           * * * 
           *  
           * @param args * 
           * @throws Exception 
           */ 
          public static void main(String[] args) throws Exception {  
              RSAPublicKey rsap = (RSAPublicKey) RSAUtil.generateKeyPair().getPublic();  
              String test = "hello world";  
              byte[] en_test = encrypt(getKeyPair().getPublic(),test.getBytes());  
              byte[] de_test = decrypt(getKeyPair().getPrivate(),en_test);  
              System.out.println(new String(de_test));  
          }  

       

      因?yàn)榘l(fā)現(xiàn)解出的明文是倒序的,后面就用StringBuffer的reverse()來轉(zhuǎn)換了一下。

      4。login.jsp所調(diào)用的js

       

      描述: login.jsp所調(diào)用的javascript,有: RSA.js BigInt.js Barrett.js

      用javascript與java進(jìn)行RSA加密與解密.rar

      bcprov-jdk14-141.jar

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多