转载请注明出处: http://blog.csdn.net/bbld_/article/details/38777491


概述

RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。关于RSA其它需要了解的知识,参考维基百科:http://zh.wikipedia.org/zh-cn/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95

在项目开发中对于一些比较敏感的信息需要对其进行加密处理,我们就可以使用RSA这种非对称加密算法来对数据进行加密处理。


使用

秘钥对的生成

1、我们可以在代码里随机生成密钥对

[java] view plaincopy
  1. /** 
  2.  * 随机生成RSA密钥对 
  3.  *  
  4.  * @param keyLength 
  5.  *            密钥长度,范围:512~2048<br> 
  6.  *            一般1024 
  7.  * @return 
  8.  */  
  9. public static KeyPair generateRSAKeyPair(int keyLength)  
  10. {  
  11.     try  
  12.     {  
  13.         KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);  
  14.         kpg.initialize(keyLength);  
  15.         return kpg.genKeyPair();  
  16.     } catch (NoSuchAlgorithmException e)  
  17.     {  
  18.         e.printStackTrace();  
  19.         return null;  
  20.     }  
  21. }  

通过这方法我们得到KeyPair后就可以调用 keyPair.getPrivate() 和 pair.getPublic()得到 私钥 和 公钥了。不过实际我们一般是使用2的方法把生成的密钥对保存起来,密钥自己保存,比如服务端,把公钥给客户端(Android)用于加密需要发送的数据,最后服务端根据私钥吧客户端加密的信息解密再处理。

2、通过OpenSSl工具生成密钥对

OpenSSl工具下载:OpenSSl工具 (64位的也可使用)使用OpenSSl工具生成密钥对的过程如下:

首先双击打开bin文件夹下的openssl.exe,打开之后是一个命令行窗口:

然后通过如下命令生成私钥:

[plain] view plaincopy
  1. genrsa -out rsa_private_key.pem 1024  



这条命令是让openssl随机生成了一份私钥,加密长度是1024位, 密钥长度,范围:512~2048。执行完命令后就可在bin文件夹下看到rsa_private_key.pem文件了。

用文本类工具打开可看到里面的内容:

[plain] view plaincopy
  1. -----BEGIN RSA PRIVATE KEY-----  
  2. MIICXQIBAAKBgQCfRTdcPIH10gT9f31rQuIInLwe7fl2dtEJ93gTmjE9c2H+kLVE  
  3. NWgECiJVQ5sonQNfwToMKdO0b3Olf4pgBKeLThraz/L3nYJYlbqjHC3jTjUnZc0l  
  4. uumpXGsox62+PuSGBlfb8zJO6hix4GV/vhyQVCpG9aYqgE7zyTRZYX9byQIDAQAB  
  5. AoGAO9+sYRtKC9xJDfcocfMxv+UT/1ic6EDgcqu6Uzwq+Jvwod9KlXqyQJqCr6T7  
  6. pjfodc3RAZOTx4gCZJverBvz053RH5GawCdocEgaqbXAAWJOhA+9IEU0NUud7ckF  
  7. yDko0QXLoGP9tanrMEt5zMqt8QxDyl6Xcij3mk8rivOgBJECQQDNTO6dZX8xCozc  
  8. Ne0gzC53Gv/KQXANBBHMr7WkKUb2i5+tXkEJ5z3abx2ppEQXDr4AgJH8Gtbm6K7t  
  9. EHV4ov4FAkEAxppD/iiT1/SVQq20be8CsiHpsjTPiestWQWdm1Qn/Y2nAkGkpCFp  
  10. yEdUvVDPtQhRN9EqNggNAnwg5kMvsuwN9QJAfHBhQe4/hk5Kyz+0l+irUW6AFOxN  
  11. KtaIo3TtuK98X/yJsOAstAACMeCgLi9vRjqdWFiWJCVwlU38mZ0cVx8UsQJBALzt  
  12. M5Er+LiPKw5rQCD0JZRfPnkQU/3XgyQUe4Gv5PsHLcCvwXeBcafcc3hEz9JfPyPi  
  13. Dk2oCvg6LPHfKBkFBaECQQCODcKX6DBWiyVxmPaJOOcF63KpCYDPkjeovIUHro1x  
  14. ElR2GrQCC/9Q4C4vruOhBQ+vX8NMPnO6NBy5TLGDwMyc  
  15. -----END RSA PRIVATE KEY-----  

这里面的内容是标准的ASCII字符,中间的一大串字符就是私钥数据了。


然后通过如下命令生成公钥:

[plain] view plaincopy
  1. rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout  


打开文件看下里面的内容:

[plain] view plaincopy
  1. -----BEGIN PUBLIC KEY-----  
  2. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfRTdcPIH10gT9f31rQuIInLwe  
  3. 7fl2dtEJ93gTmjE9c2H+kLVENWgECiJVQ5sonQNfwToMKdO0b3Olf4pgBKeLThra  
  4. z/L3nYJYlbqjHC3jTjUnZc0luumpXGsox62+PuSGBlfb8zJO6hix4GV/vhyQVCpG  
  5. 9aYqgE7zyTRZYX9byQIDAQAB  
  6. -----END PUBLIC KEY-----  

可以看到是跟私钥的文件类似的。


这样密钥就基本生成了,不过这样密钥对的私钥是无法在代码中直接使用的,要想使用它需要借助RSAPrivateKeyStructure这个类,Java是不自带的。所以为了方便使用,我们需要对私钥进行PKCS#8编码,命令如下:

[plain] view plaincopy
  1. pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt    


这条命令的结果依然是在bin文件夹生成了pkcs8_rsa_private_key.pem文件,打开内容如下:

[plain] view plaincopy
  1. -----BEGIN PRIVATE KEY-----  
  2. MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ9FN1w8gfXSBP1/  
  3. fWtC4gicvB7t+XZ20Qn3eBOaMT1zYf6QtUQ1aAQKIlVDmyidA1/BOgwp07Rvc6V/  
  4. imAEp4tOGtrP8vedgliVuqMcLeNONSdlzSW66alcayjHrb4+5IYGV9vzMk7qGLHg  
  5. ZX++HJBUKkb1piqATvPJNFlhf1vJAgMBAAECgYA736xhG0oL3EkN9yhx8zG/5RP/  
  6. WJzoQOByq7pTPCr4m/Ch30qVerJAmoKvpPumN+h1zdEBk5PHiAJkm96sG/PTndEf  
  7. kZrAJ2hwSBqptcABYk6ED70gRTQ1S53tyQXIOSjRBcugY/21qeswS3nMyq3xDEPK  
  8. XpdyKPeaTyuK86AEkQJBAM1M7p1lfzEKjNw17SDMLnca/8pBcA0EEcyvtaQpRvaL  
  9. n61eQQnnPdpvHamkRBcOvgCAkfwa1uboru0QdXii/gUCQQDGmkP+KJPX9JVCrbRt  
  10. 7wKyIemyNM+J6y1ZBZ2bVCf9jacCQaSkIWnIR1S9UM+1CFE30So2CA0CfCDmQy+y  
  11. 7A31AkB8cGFB7j+GTkrLP7SX6KtRboAU7E0q1oijdO24r3xf/Imw4Cy0AAIx4KAu  
  12. L29GOp1YWJYkJXCVTfyZnRxXHxSxAkEAvO0zkSv4uI8rDmtAIPQllF8+eRBT/deD  
  13. JBR7ga/k+wctwK/Bd4Fxp9xzeETP0l8/I+IOTagK+Dos8d8oGQUFoQJBAI4Nwpfo  
  14. MFaLJXGY9ok45wXrcqkJgM+SN6i8hQeujXESVHYatAIL/1DgLi+u46EFD69fw0w+  
  15. c7o0HLlMsYPAzJw=  
  16. -----END PRIVATE KEY-----  

可以看到中间的私钥内容有所变化了,这样的私钥我们在代码里就方便使用了。


以上的密钥文件使用时需要注意吧头和尾的字符串去掉,我们只取中间的内容。


代码中的使用

首先我们需要封装写个RSA的工具类,方便加密解密的操作。

[java] view plaincopy
  1. package com.example.rsa;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.IOException;  
  5. import java.io.InputStream;  
  6. import java.io.InputStreamReader;  
  7. import java.math.BigInteger;  
  8. import java.security.KeyFactory;  
  9. import java.security.KeyPair;  
  10. import java.security.KeyPairGenerator;  
  11. import java.security.NoSuchAlgorithmException;  
  12. import java.security.PrivateKey;  
  13. import java.security.PublicKey;  
  14. import java.security.interfaces.RSAPrivateKey;  
  15. import java.security.interfaces.RSAPublicKey;  
  16. import java.security.spec.InvalidKeySpecException;  
  17. import java.security.spec.PKCS8EncodedKeySpec;  
  18. import java.security.spec.RSAPublicKeySpec;  
  19. import java.security.spec.X509EncodedKeySpec;  
  20.   
  21. import javax.crypto.Cipher;  
  22.   
  23. /** 
  24.  * @author Mr.Zheng 
  25.  * @date 2014年8月22日 下午1:44:23 
  26.  */  
  27. public final class RSAUtils  
  28. {  
  29.     private static String RSA = "RSA";  
  30.   
  31.     /** 
  32.      * 随机生成RSA密钥对(默认密钥长度为1024) 
  33.      *  
  34.      * @return 
  35.      */  
  36.     public static KeyPair generateRSAKeyPair()  
  37.     {  
  38.         return generateRSAKeyPair(1024);  
  39.     }  
  40.   
  41.     /** 
  42.      * 随机生成RSA密钥对 
  43.      *  
  44.      * @param keyLength 
  45.      *            密钥长度,范围:512~2048<br> 
  46.      *            一般1024 
  47.      * @return 
  48.      */  
  49.     public static KeyPair generateRSAKeyPair(int keyLength)  
  50.     {  
  51.         try  
  52.         {  
  53.             KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);  
  54.             kpg.initialize(keyLength);  
  55.             return kpg.genKeyPair();  
  56.         } catch (NoSuchAlgorithmException e)  
  57.         {  
  58.             e.printStackTrace();  
  59.             return null;  
  60.         }  
  61.     }  
  62.   
  63.     /** 
  64.      * 用公钥加密 <br> 
  65.      * 每次加密的字节数,不能超过密钥的长度值减去11 
  66.      *  
  67.      * @param data 
  68.      *            需加密数据的byte数据 
  69.      * @param pubKey 
  70.      *            公钥 
  71.      * @return 加密后的byte型数据 
  72.      */  
  73.     public static byte[] encryptData(byte[] data, PublicKey publicKey)  
  74.     {  
  75.         try  
  76.         {  
  77.             Cipher cipher = Cipher.getInstance(RSA);  
  78.             // 编码前设定编码方式及密钥  
  79.             cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
  80.             // 传入编码数据并返回编码结果  
  81.             return cipher.doFinal(data);  
  82.         } catch (Exception e)  
  83.         {  
  84.             e.printStackTrace();  
  85.             return null;  
  86.         }  
  87.     }  
  88.   
  89.     /** 
  90.      * 用私钥解密 
  91.      *  
  92.      * @param encryptedData 
  93.      *            经过encryptedData()加密返回的byte数据 
  94.      * @param privateKey 
  95.      *            私钥 
  96.      * @return 
  97.      */  
  98.     public static byte[] decryptData(byte[] encryptedData, PrivateKey privateKey)  
  99.     {  
  100.         try  
  101.         {  
  102.             Cipher cipher = Cipher.getInstance(RSA);  
  103.             cipher.init(Cipher.DECRYPT_MODE, privateKey);  
  104.             return cipher.doFinal(encryptedData);  
  105.         } catch (Exception e)  
  106.         {  
  107.             return null;  
  108.         }  
  109.     }  
  110.   
  111.     /** 
  112.      * 通过公钥byte[](publicKey.getEncoded())将公钥还原,适用于RSA算法 
  113.      *  
  114.      * @param keyBytes 
  115.      * @return 
  116.      * @throws NoSuchAlgorithmException 
  117.      * @throws InvalidKeySpecException 
  118.      */  
  119.     public static PublicKey getPublicKey(byte[] keyBytes) throws NoSuchAlgorithmException,  
  120.             InvalidKeySpecException  
  121.     {  
  122.         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);  
  123.         KeyFactory keyFactory = KeyFactory.getInstance(RSA);  
  124.         PublicKey publicKey = keyFactory.generatePublic(keySpec);  
  125.         return publicKey;  
  126.     }  
  127.   
  128.     /** 
  129.      * 通过私钥byte[]将公钥还原,适用于RSA算法 
  130.      *  
  131.      * @param keyBytes 
  132.      * @return 
  133.      * @throws NoSuchAlgorithmException 
  134.      * @throws InvalidKeySpecException 
  135.      */  
  136.     public static PrivateKey getPrivateKey(byte[] keyBytes) throws NoSuchAlgorithmException,  
  137.             InvalidKeySpecException  
  138.     {  
  139.         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);  
  140.         KeyFactory keyFactory = KeyFactory.getInstance(RSA);  
  141.         PrivateKey privateKey = keyFactory.generatePrivate(keySpec);  
  142.         return privateKey;  
  143.     }  
  144.   
  145.     /** 
  146.      * 使用N、e值还原公钥 
  147.      *  
  148.      * @param modulus 
  149.      * @param publicExponent 
  150.      * @return 
  151.      * @throws NoSuchAlgorithmException 
  152.      * @throws InvalidKeySpecException 
  153.      */  
  154.     public static PublicKey getPublicKey(String modulus, String publicExponent)  
  155.             throws NoSuchAlgorithmException, InvalidKeySpecException  
  156.     {  
  157.         BigInteger bigIntModulus = new BigInteger(modulus);  
  158.         BigInteger bigIntPrivateExponent = new BigInteger(publicExponent);  
  159.         RSAPublicKeySpec keySpec = new RSAPublicKeySpec(bigIntModulus, bigIntPrivateExponent);  
  160.         KeyFactory keyFactory = KeyFactory.getInstance(RSA);  
  161.         PublicKey publicKey = keyFactory.generatePublic(keySpec);  
  162.         return publicKey;  
  163.     }  
  164.   
  165.     /** 
  166.      * 使用N、d值还原私钥 
  167.      *  
  168.      * @param modulus 
  169.      * @param privateExponent 
  170.      * @return 
  171.      * @throws NoSuchAlgorithmException 
  172.      * @throws InvalidKeySpecException 
  173.      */  
  174.     public static PrivateKey getPrivateKey(String modulus, String privateExponent)  
  175.             throws NoSuchAlgorithmException, InvalidKeySpecException  
  176.     {  
  177.         BigInteger bigIntModulus = new BigInteger(modulus);  
  178.         BigInteger bigIntPrivateExponent = new BigInteger(privateExponent);  
  179.         RSAPublicKeySpec keySpec = new RSAPublicKeySpec(bigIntModulus, bigIntPrivateExponent);  
  180.         KeyFactory keyFactory = KeyFactory.getInstance(RSA);  
  181.         PrivateKey privateKey = keyFactory.generatePrivate(keySpec);  
  182.         return privateKey;  
  183.     }  
  184.   
  185.     /** 
  186.      * 从字符串中加载公钥 
  187.      *  
  188.      * @param publicKeyStr 
  189.      *            公钥数据字符串 
  190.      * @throws Exception 
  191.      *             加载公钥时产生的异常 
  192.      */  
  193.     public static PublicKey loadPublicKey(String publicKeyStr) throws Exception  
  194.     {  
  195.         try  
  196.         {  
  197.             byte[] buffer = Base64Utils.decode(publicKeyStr);  
  198.             KeyFactory keyFactory = KeyFactory.getInstance(RSA);  
  199.             X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);  
  200.             return (RSAPublicKey) keyFactory.generatePublic(keySpec);  
  201.         } catch (NoSuchAlgorithmException e)  
  202.         {  
  203.             throw new Exception("无此算法");  
  204.         } catch (InvalidKeySpecException e)  
  205.         {  
  206.             throw new Exception("公钥非法");  
  207.         } catch (NullPointerException e)  
  208.         {  
  209.             throw new Exception("公钥数据为空");  
  210.         }  
  211.     }  
  212.   
  213.     /** 
  214.      * 从字符串中加载私钥<br> 
  215.      * 加载时使用的是PKCS8EncodedKeySpec(PKCS#8编码的Key指令)。 
  216.      *  
  217.      * @param privateKeyStr 
  218.      * @return 
  219.      * @throws Exception 
  220.      */  
  221.     public static PrivateKey loadPrivateKey(String privateKeyStr) throws Exception  
  222.     {  
  223.         try  
  224.         {  
  225.             byte[] buffer = Base64Utils.decode(privateKeyStr);  
  226.             // X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);  
  227.             PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);  
  228.             KeyFactory keyFactory = KeyFactory.getInstance(RSA);  
  229.             return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);  
  230.         } catch (NoSuchAlgorithmException e)  
  231.         {  
  232.             throw new Exception("无此算法");  
  233.         } catch (InvalidKeySpecException e)  
  234.         {  
  235.             throw new Exception("私钥非法");  
  236.         } catch (NullPointerException e)  
  237.         {  
  238.             throw new Exception("私钥数据为空");  
  239.         }  
  240.     }  
  241.   
  242.     /** 
  243.      * 从文件中输入流中加载公钥 
  244.      *  
  245.      * @param in 
  246.      *            公钥输入流 
  247.      * @throws Exception 
  248.      *             加载公钥时产生的异常 
  249.      */  
  250.     public static PublicKey loadPublicKey(InputStream in) throws Exception  
  251.     {  
  252.         try  
  253.         {  
  254.             return loadPublicKey(readKey(in));  
  255.         } catch (IOException e)  
  256.         {  
  257.             throw new Exception("公钥数据流读取错误");  
  258.         } catch (NullPointerException e)  
  259.         {  
  260.             throw new Exception("公钥输入流为空");  
  261.         }  
  262.     }  
  263.   
  264.     /** 
  265.      * 从文件中加载私钥 
  266.      *  
  267.      * @param keyFileName 
  268.      *            私钥文件名 
  269.      * @return 是否成功 
  270.      * @throws Exception 
  271.      */  
  272.     public static PrivateKey loadPrivateKey(InputStream in) throws Exception  
  273.     {  
  274.         try  
  275.         {  
  276.             return loadPrivateKey(readKey(in));  
  277.         } catch (IOException e)  
  278.         {  
  279.             throw new Exception("私钥数据读取错误");  
  280.         } catch (NullPointerException e)  
  281.         {  
  282.             throw new Exception("私钥输入流为空");  
  283.         }  
  284.     }  
  285.   
  286.     /** 
  287.      * 读取密钥信息 
  288.      *  
  289.      * @param in 
  290.      * @return 
  291.      * @throws IOException 
  292.      */  
  293.     private static String readKey(InputStream in) throws IOException  
  294.     {  
  295.         BufferedReader br = new BufferedReader(new InputStreamReader(in));  
  296.         String readLine = null;  
  297.         StringBuilder sb = new StringBuilder();  
  298.         while ((readLine = br.readLine()) != null)  
  299.         {  
  300.             if (readLine.charAt(0) == '-')  
  301.             {  
  302.                 continue;  
  303.             } else  
  304.             {  
  305.                 sb.append(readLine);  
  306.                 sb.append('\r');  
  307.             }  
  308.         }  
  309.   
  310.         return sb.toString();  
  311.     }  
  312.   
  313.     /** 
  314.      * 打印公钥信息 
  315.      *  
  316.      * @param publicKey 
  317.      */  
  318.     public static void printPublicKeyInfo(PublicKey publicKey)  
  319.     {  
  320.         RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;  
  321.         System.out.println("----------RSAPublicKey----------");  
  322.         System.out.println("Modulus.length=" + rsaPublicKey.getModulus().bitLength());  
  323.         System.out.println("Modulus=" + rsaPublicKey.getModulus().toString());  
  324.         System.out.println("PublicExponent.length=" + rsaPublicKey.getPublicExponent().bitLength());  
  325.         System.out.println("PublicExponent=" + rsaPublicKey.getPublicExponent().toString());  
  326.     }  
  327.   
  328.     public static void printPrivateKeyInfo(PrivateKey privateKey)  
  329.     {  
  330.         RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) privateKey;  
  331.         System.out.println("----------RSAPrivateKey ----------");  
  332.         System.out.println("Modulus.length=" + rsaPrivateKey.getModulus().bitLength());  
  333.         System.out.println("Modulus=" + rsaPrivateKey.getModulus().toString());  
  334.         System.out.println("PrivateExponent.length=" + rsaPrivateKey.getPrivateExponent().bitLength());  
  335.         System.out.println("PrivatecExponent=" + rsaPrivateKey.getPrivateExponent().toString());  
  336.   
  337.     }  
  338.   
  339. }  

上面需要注意的就是加密是有长度限制的,过长的话会抛异常!!!


代码中有些需要使用Base64再转换的,而java中不自带,Android中自带,所以自己写出一个来,方便Java后台使用

[java] view plaincopy
  1. package com.example.rsa;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4.   
  5. /** 
  6.  * @author Mr.Zheng 
  7.  * @date 2014年8月22日 下午9:50:28 
  8.  */  
  9. public class Base64Utils  
  10. {  
  11.     private static char[] base64EncodeChars = new char[]  
  12.     { 'A''B''C''D''E''F''G''H''I''J''K''L''M''N''O''P''Q''R''S''T',  
  13.             'U''V''W''X''Y''Z''a''b''c''d''e''f''g''h''i''j''k''l''m',  
  14.             'n''o''p''q''r''s''t''u''v''w''x''y''z''0''1''2''3''4''5',  
  15.             '6''7''8''9''+''/' };  
  16.     private static byte[] base64DecodeChars = new byte[]  
  17.     { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,  
  18.             -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -162, -1, -1, -1635253,  
  19.             5455565758596061, -1, -1, -1, -1, -1, -1, -101234567891011,  
  20.             1213141516171819202122232425, -1, -1, -1, -1, -1, -126272829,  
  21.             30313233343536373839404142434445464748495051, -1, -1,  
  22.             -1, -1, -1 };  
  23.   
  24.     /** 
  25.      * 加密 
  26.      *  
  27.      * @param data 
  28.      * @return 
  29.      */  
  30.     public static String encode(byte[] data)  
  31.     {  
  32.         StringBuffer sb = new StringBuffer();  
  33.         int len = data.length;  
  34.         int i = 0;  
  35.         int b1, b2, b3;  
  36.         while (i < len)  
  37.         {  
  38.             b1 = data[i++] & 0xff;  
  39.             if (i == len)  
  40.             {  
  41.                 sb.append(base64EncodeChars[b1 >>> 2]);  
  42.                 sb.append(base64EncodeChars[(b1 & 0x3) << 4]);  
  43.                 sb.append("==");  
  44.                 break;  
  45.             }  
  46.             b2 = data[i++] & 0xff;  
  47.             if (i == len)  
  48.             {  
  49.                 sb.append(base64EncodeChars[b1 >>> 2]);  
  50.                 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);  
  51.                 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]);  
  52.                 sb.append("=");  
  53.                 break;  
  54.             }  
  55.             b3 = data[i++] & 0xff;  
  56.             sb.append(base64EncodeChars[b1 >>> 2]);  
  57.             sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]);  
  58.             sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]);  
  59.             sb.append(base64EncodeChars[b3 & 0x3f]);  
  60.         }  
  61.         return sb.toString();  
  62.     }  
  63.   
  64.     /** 
  65.      * 解密 
  66.      *  
  67.      * @param str 
  68.      * @return 
  69.      */  
  70.     public static byte[] decode(String str)  
  71.     {  
  72.         try  
  73.         {  
  74.             return decodePrivate(str);  
  75.         } catch (UnsupportedEncodingException e)  
  76.         {  
  77.             e.printStackTrace();  
  78.         }  
  79.         return new byte[]  
  80.         {};  
  81.     }  
  82.   
  83.     private static byte[] decodePrivate(String str) throws UnsupportedEncodingException  
  84.     {  
  85.         StringBuffer sb = new StringBuffer();  
  86.         byte[] data = null;  
  87.         data = str.getBytes("US-ASCII");  
  88.         int len = data.length;  
  89.         int i = 0;  
  90.         int b1, b2, b3, b4;  
  91.         while (i < len)  
  92.         {  
  93.   
  94.             do  
  95.             {  
  96.                 b1 = base64DecodeChars[data[i++]];  
  97.             } while (i < len && b1 == -1);  
  98.             if (b1 == -1)  
  99.                 break;  
  100.   
  101.             do  
  102.             {  
  103.                 b2 = base64DecodeChars[data[i++]];  
  104.             } while (i < len && b2 == -1);  
  105.             if (b2 == -1)  
  106.                 break;  
  107.             sb.append((char) ((b1 << 2) | ((b2 & 0x30) >>> 4)));  
  108.   
  109.             do  
  110.             {  
  111.                 b3 = data[i++];  
  112.                 if (b3 == 61)  
  113.                     return sb.toString().getBytes("iso8859-1");  
  114.                 b3 = base64DecodeChars[b3];  
  115.             } while (i < len && b3 == -1);  
  116.             if (b3 == -1)  
  117.                 break;  
  118.             sb.append((char) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2)));  
  119.   
  120.             do  
  121.             {  
  122.                 b4 = data[i++];  
  123.                 if (b4 == 61)  
  124.                     return sb.toString().getBytes("iso8859-1");  
  125.                 b4 = base64DecodeChars[b4];  
  126.             } while (i < len && b4 == -1);  
  127.             if (b4 == -1)  
  128.                 break;  
  129.             sb.append((char) (((b3 & 0x03) << 6) | b4));  
  130.         }  
  131.         return sb.toString().getBytes("iso8859-1");  
  132.     }  
  133.   
  134. }  

最后就是真正使用它们了:

[java] view plaincopy
  1. package com.example.rsa;  
  2.   
  3. import java.io.InputStream;  
  4. import java.security.PrivateKey;  
  5. import java.security.PublicKey;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.util.Base64;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.EditText;  
  14.   
  15. public class MainActivity extends Activity implements OnClickListener  
  16. {  
  17.     private Button btn1, btn2;// 加密,解密  
  18.     private EditText et1, et2, et3;// 需加密的内容,加密后的内容,解密后的内容  
  19.   
  20.     /* 密钥内容 base64 code */  
  21.     private static String PUCLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCfRTdcPIH10gT9f31rQuIInLwe"  
  22.             + "\r" + "7fl2dtEJ93gTmjE9c2H+kLVENWgECiJVQ5sonQNfwToMKdO0b3Olf4pgBKeLThra" + "\r"  
  23.             + "z/L3nYJYlbqjHC3jTjUnZc0luumpXGsox62+PuSGBlfb8zJO6hix4GV/vhyQVCpG" + "\r"  
  24.             + "9aYqgE7zyTRZYX9byQIDAQAB" + "\r";  
  25.     private static String PRIVATE_KEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ9FN1w8gfXSBP1/"  
  26.             + "\r" + "fWtC4gicvB7t+XZ20Qn3eBOaMT1zYf6QtUQ1aAQKIlVDmyidA1/BOgwp07Rvc6V/" + "\r"  
  27.             + "imAEp4tOGtrP8vedgliVuqMcLeNONSdlzSW66alcayjHrb4+5IYGV9vzMk7qGLHg" + "\r"  
  28.             + "ZX++HJBUKkb1piqATvPJNFlhf1vJAgMBAAECgYA736xhG0oL3EkN9yhx8zG/5RP/" + "\r"  
  29.             + "WJzoQOByq7pTPCr4m/Ch30qVerJAmoKvpPumN+h1zdEBk5PHiAJkm96sG/PTndEf" + "\r"  
  30.             + "kZrAJ2hwSBqptcABYk6ED70gRTQ1S53tyQXIOSjRBcugY/21qeswS3nMyq3xDEPK" + "\r"  
  31.             + "XpdyKPeaTyuK86AEkQJBAM1M7p1lfzEKjNw17SDMLnca/8pBcA0EEcyvtaQpRvaL" + "\r"  
  32.             + "n61eQQnnPdpvHamkRBcOvgCAkfwa1uboru0QdXii/gUCQQDGmkP+KJPX9JVCrbRt" + "\r"  
  33.             + "7wKyIemyNM+J6y1ZBZ2bVCf9jacCQaSkIWnIR1S9UM+1CFE30So2CA0CfCDmQy+y" + "\r"  
  34.             + "7A31AkB8cGFB7j+GTkrLP7SX6KtRboAU7E0q1oijdO24r3xf/Imw4Cy0AAIx4KAu" + "\r"  
  35.             + "L29GOp1YWJYkJXCVTfyZnRxXHxSxAkEAvO0zkSv4uI8rDmtAIPQllF8+eRBT/deD" + "\r"  
  36.             + "JBR7ga/k+wctwK/Bd4Fxp9xzeETP0l8/I+IOTagK+Dos8d8oGQUFoQJBAI4Nwpfo" + "\r"  
  37.             + "MFaLJXGY9ok45wXrcqkJgM+SN6i8hQeujXESVHYatAIL/1DgLi+u46EFD69fw0w+" + "\r" + "c7o0HLlMsYPAzJw="  
  38.             + "\r";  
  39.   
  40.     @Override  
  41.     protected void onCreate(Bundle savedInstanceState)  
  42.     {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.activity_main);  
  45.         initView();  
  46.     }  
  47.   
  48.     private void initView()  
  49.     {  
  50.         btn1 = (Button) findViewById(R.id.btn1);  
  51.         btn2 = (Button) findViewById(R.id.btn2);  
  52.         btn1.setOnClickListener(this);  
  53.         btn2.setOnClickListener(this);  
  54.   
  55.         et1 = (EditText) findViewById(R.id.et1);  
  56.         et2 = (EditText) findViewById(R.id.et2);  
  57.         et3 = (EditText) findViewById(R.id.et3);  
  58.     }  
  59.   
  60.     @Override  
  61.     public void onClick(View v)  
  62.     {  
  63.         switch (v.getId())  
  64.         {  
  65.         // 加密  
  66.         case R.id.btn1:  
  67.             String source = et1.getText().toString().trim();  
  68.             try  
  69.             {  
  70.                 // 从字符串中得到公钥  
  71.                 // PublicKey publicKey = RSAUtils.loadPublicKey(PUCLIC_KEY);  
  72.                 // 从文件中得到公钥  
  73.                 InputStream inPublic = getResources().getAssets().open("rsa_public_key.pem");  
  74.                 PublicKey publicKey = RSAUtils.loadPublicKey(inPublic);  
  75.                 // 加密  
  76.                 byte[] encryptByte = RSAUtils.encryptData(source.getBytes(), publicKey);  
  77.                 // 为了方便观察吧加密后的数据用base64加密转一下,要不然看起来是乱码,所以解密是也是要用Base64先转换  
  78.                 String afterencrypt = Base64Utils.encode(encryptByte);  
  79.                 et2.setText(afterencrypt);  
  80.             } catch (Exception e)  
  81.             {  
  82.                 e.printStackTrace();  
  83.             }  
  84.             break;  
  85.         // 解密  
  86.         case R.id.btn2:  
  87.             String encryptContent = et2.getText().toString().trim();  
  88.             try  
  89.             {  
  90.                 // 从字符串中得到私钥  
  91.                 // PrivateKey privateKey = RSAUtils.loadPrivateKey(PRIVATE_KEY);  
  92.                 // 从文件中得到私钥  
  93.                 InputStream inPrivate = getResources().getAssets().open("pkcs8_rsa_private_key.pem");  
  94.                 PrivateKey privateKey = RSAUtils.loadPrivateKey(inPrivate);  
  95.                 // 因为RSA加密后的内容经Base64再加密转换了一下,所以先Base64解密回来再给RSA解密  
  96.                 byte[] decryptByte = RSAUtils.decryptData(Base64Utils.decode(encryptContent), privateKey);  
  97.                 String decryptStr = new String(decryptByte);  
  98.                 et3.setText(decryptStr);  
  99.             } catch (Exception e)  
  100.             {  
  101.                 e.printStackTrace();  
  102.             }  
  103.             break;  
  104.         default:  
  105.             break;  
  106.         }  
  107.     }  
  108.   
  109. }  

我把密钥放到assest资源文件夹里了,也可以直接使用字符串得到,上面注释掉了。

最后我们来看下效果吧:



源码下载地址:http://download.csdn.net/detail/bbld_/7806673

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Ultra Edit使用技巧

    Ultra Edit使用技巧1.去掉横向滚动条(自动换行) 在菜单栏选择“高级->配置”,进入如下界面。然后在“编辑器”选项的“自动换行”界面里,选择“默认为每个文件启用自动换行”。2.列编辑模式 按“ALT + c”组合键可进入列编辑模式,可以按列选择或者编辑文本内容。3.删除空…...

    2024/4/16 8:53:32
  2. 【ASP.NET】Aspnetpager对GridView分页,并导出Excel

    一、前言 谈到分页,在网页上简直到处都是。网络的资源越来越多,如果不用分页技术来显示,就会拖拉很长很长。下面给大家分享分页技术。二、基本要点 当要显示数据量足够大的时候,我们往往采用分页显示的处理办法。分页有真分页和假分页。假分页:从数据库中取出所…...

    2024/4/13 7:55:07
  3. 阿里巴巴2018校招编程测试题

    题目描述说实话第一眼看到这道题我感觉像是博弈论。30分钟的时间没有做出来,只能骗点分,证明我是会写java的 还是说正题吧题目是这样的,A、B是两个无聊的人,他们决定玩个游戏:现在有一个非负整数组成的数组,A和B轮流从数组中取出一个数,且只能从数组的两端取,每个人都…...

    2024/4/15 7:47:58
  4. Javascript设计模式-15-享元模式

    Javascript设计模式 - 15 - 享元模式说明享元模式是一种用于性能优化的模式,它的核心是运用共享技术来有效支持大量细粒度的对象下边例子借用了 《javascript 设计模式与开发实践》内部状态和外部状态享元模式要求将对象的属性划分为内部状态与外部状态(状态指的是属性),享…...

    2024/4/12 16:07:11
  5. STL源码剖析——STL算法之find查找算法

    前言由于在前文的《STL算法剖析》中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解。本文介绍的STL算法中的find、search查找算法。在STL源码中有关算法的函数大部分在本文介绍,包含findandfind_if、adjacent_find、…...

    2024/4/12 16:07:16
  6. Linux终端使用技巧及其他(整理)

    一、快捷键 转自:http://xace.iteye.com/blog/481074 Shift+Ctrl+T:新建标签页 Shift+Ctrl+W:关闭标签页 Ctrl+PageUp:前一标签页 Ctrl+PageDown:后一标签页 Shift+Ctrl+PageUp:标签页左移 Shift+Ctrl+PageDown:标签页右移 Alt+1:切换到标签页1 Alt+2:切换到标签页2 A…...

    2024/4/12 16:07:06
  7. dwz系列之三--分页

    官方文档说明分页组件 分页思路服务器返回当前页的数据,总条数,再由js来生成分页标签。分页是配合服务器端来处理的, 不是存js做的分页。 因为如果数据量很大,比如有好几百页,存js分页就是悲剧了,存js分页是必须一次载入所有数据,性能很慢。 分页组件参数要由服务器传过来…...

    2024/4/15 7:47:53
  8. JS设计模式——迭代器模式

    模式作用:1,为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作2,对于集合内部结果常常变化各异,我们不想暴露其内部结果的话,但又想让客户代码透明的访问其中的元素,这种情况下我们可以使用迭代器模式注意事项:1,一般的迭代,我们…...

    2024/4/28 2:16:50
  9. 阿里巴巴笔试的一道综合题

    题目描述: 当你在浏览器输入一个网址,比如http://www.taobao.com,按回车之后发生了什么?请从技术的角度描述,如浏览器、网络(UDP,TCP,HTTP等),以及服务器等各种参数与对象上由此引发的一系列活动。请尽可能的涉及到所有的关键技术点。 这道题目还是蛮有意思的,了解这…...

    2024/4/28 1:16:04
  10. javascript设计模式-简单工厂模式

    javascript设计模式-简单工厂模式简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 这些实例都拥有相同的函数入口. 这种模式可以很好的解决不确定同一类型操作下的不同处理,将同一类型操作的工厂化,之后在需要的时候让工厂加工即可。 就好像,看电视,电视里面有很多频道…...

    2024/4/19 11:54:04
  11. 【STL源码剖析读书笔记】【第4章】序列式容器之list和slist

    一、list 1、list概述 list是双向链表,对于任何位置的元素插入或元素移除,list永远是常数时间。 2、list的节点 list本身和list节点是不同的数据结构,需要分开设计。STL list的节点结构:template <class T> struct __list_node {typedef void* void_pointer;void_poi…...

    2024/4/12 16:06:56
  12. 分页条中显示数字页码的计算方法

    摘要:在做web分页的时候,分页条中数字显示个数的计算方法。没有用现成的分页组建来做分页条。自己写了段简单的计算分页的代码。 2014-8-8 15:56:46 fix one bug. detailDesc: 使用 calcPage(4, 5, 4);将会导致分页异常。页码多的时候,当前页始终保持是分页条中显示的最中间…...

    2024/4/15 10:18:10
  13. 阿里巴巴2013年算法笔试题

    考试相关信息 今天去清华大学参加算法工程师的笔试,这次阿里巴巴的校园招聘在北京有好多个点,这次笔试就有以下几个考点(通知考试时收到的信息) 研发工程师:北京大学、北京邮电大学、北京航空航天大学、中国科学院大学(中关村校区) 算法工程师:清华大学 测试工程师:中国…...

    2024/4/12 16:07:01
  14. 受用一生的高效 PyCharm 使用技巧

    受用一生的高效 PyCharm 使用技巧(一) 受用一生的高效 PyCharm 使用技巧(二) 受用一生的高效 PyCharm 使用技巧(三) 受用一生的高效 PyCharm 使用技巧(四) 受用一生的高效 PyCharm 使用技巧(五) 受用一生的高效 PyCharm 使用技巧(六)...

    2024/4/9 11:19:33
  15. 用例的概要讲解

    谈到用例,可能很多人比较熟悉,但是也有不少人不会真正的使用。接下来根据一段时间的累积和看书了解,总结如下,难免有误,还望批评指正,共同进步。 用例是需求阶段的产物,是为了帮助获取和挖掘系统需求用的。首先,我们看什么是需求,需求是系统或项目必须提供的能力和必须…...

    2024/4/17 0:32:29
  16. javascript设计模式(二)--闭包实现

    类的静态变量通过闭包来实现 // var Book = (function(){//var bookNum = 0;//function checkBook(name){}//return function(newId,newName,newPrice){var name,price;function checkID(id){}this.getName = function(){};this.getPrice = function(){};this.setName = functi…...

    2024/4/13 2:07:58
  17. 五.STL源码剖析(仿函数)

    1.概念2.可配接的关键3.算术类4.关系运算5.逻辑运算6.证同...

    2024/4/9 11:19:31
  18. 阿里社招笔试三个题目超级简单,但是我没有做完,醉了

    三、找到一个无序数组中找两个特定数,使其相加等于特定数字,请写代码java将它找出来,并指出时间复杂度。 例如* 【10,25,19,89,75,56,34,54,16,9,-5】找到相加等于28的【19,9 】源码:/*** 功能说明:TODO** @date 2020年5月18日* * */ public class TextTest {/*** 三、…...

    2024/4/19 22:30:25
  19. Vue组件实现分页

    一.介绍 本方法利用vue的父子组件实现分页功能,UI来自bootstrap。实现效果是最大页数小于五时全部显示,分页只显示五个页数,具体页码显示范围根据当前页与最大页数来变换。效果如下图所示: 二.子组件部分 Vue.component(page-divide,{props:[index,ma…...

    2024/4/18 16:44:18
  20. Android RSA加密解密

    转载请注明出处: http://blog.csdn.net/bbld_/article/details/38777491概述RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个…...

    2024/4/22 3:15:44

最新文章

  1. Linux系统及工具的使用

    ​ Linux的版本系列与划分: Redhat与Debian系介绍(Linux各种发行版本概述)_酷炫人笨笨熊-CSDN博客_redhat和debian的区别 ubuntu下 1.打开 .bashrc文件&#xff0c; 在最后面添加下面一句话 Ubuntu 22.04下安装配置rime五笔输入法_ubuntu 22.04 五笔_繁星间漫步的博客-CSDN博客…...

    2024/4/28 4:54:19
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?

    问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null&#xff0c;那么typeof nullValue "?" const u …...

    2024/4/28 3:06:37
  4. 蓝桥杯加训

    1.两只塔姆沃斯牛&#xff08;模拟&#xff09; 思路&#xff1a;人和牛都记录三个数据&#xff0c;当前坐标和走的方向&#xff0c;如果人和牛的坐标和方向走重复了&#xff0c;那就说明一直在绕圈圈&#xff0c;无解 #include<iostream> using namespace std; const i…...

    2024/4/27 19:03:08
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57