测试:

 public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.initKey(2048);String PrivateKey = RSAUtil.getPrivateKey(map);String PublicKey = RSAUtil.getPublicKey(map);System.out.println("PrivateKey:" + PrivateKey);System.out.println("PublicKey:" + PublicKey);//明文String data = "hello rsa!";//公钥加密私钥解密byte[] encData = RSAUtil.encryptByPublicKey(data.getBytes(), PublicKey);byte[] decData = RSAUtil.decryptByPrivateKey(encData, PrivateKey);System.out.println(new String(decData));//私钥加密公钥解密byte[] encData1 = RSAUtil.encryptByPrivateKey(data.getBytes(), PrivateKey);byte[] decData1 = RSAUtil.decryptByPublicKey(encData1, PublicKey);System.out.println(new String(decData1));//私钥签名公钥验签String signStr = RSAUtil.sign(data.getBytes(), PrivateKey);boolean verify = RSAUtil.verify(data.getBytes(), PublicKey, signStr);System.out.println(signStr + verify);} catch (Exception e) {//密钥不对等情况e.printStackTrace();}}

输出

"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.2\lib\idea_rt.jar=52263:D:\Program Files\JetBrains\IntelliJ IDEA 2020.2\bin" -Dfile.encoding=UTF-8 -classpath "E:\javaproj\rsa-demo\bin;C:\Program Files\Java\jdk1.8.0_221\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_221\jre\lib\rt.jar;E:\javaproj\rsa-demo\lib\commons-codec-1.10.jar" com.wjs.rsaDemo.RSAUtil
PrivateKey:MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4RzF0kVMItCUy2brRPpl9sv1zdza0Xn5/kAUqE7Ykm3zU92tFZpCX9YrsKp4cxEC8uwotEibE3qbh8lGN+G1pa55t7YmX0lOW6L7x5z5eMSx2J8oQ7qpAA3pPRquZg85ke8thJJJpnCLgYJAZhlTSgKvBzwECy998RpV8eqRDlr60BH+GcgCa5yLyO7O/l9hzTgipkCkdXKx4X74LilfADFPhVgC5y/03RQnFXcmrfjbOlLxIyef4Z56WeXo7zAuxSG2YR1xyt3rupxF1uIBn8XbuL7jdt4wgQF0JVxmGB1SWMzG7r3LyxPIbnEMAiA//iNSUfKCNRuZOIyalyOaRAgMBAAECggEACYbEq74HiN+nPKW83qxZywHB0IJNNa3c5ENRwQcb13CiV3Ai/4d52iE7eVIKsnoCzr7sm7/geTT5c5zPUoORRG3n1s782fhpkdeeZ2sI8l2gastLyuxLqNuFKywAGwORW+h6bx8w4nzL4MWdLXSgVfGI75AAAWEAwK/1cmX0r/m4jUMG+dePEhO1aQMVMEEYpzHh9rEpdRaXdsErJshQJv9fAtIaY0NWQprSh+BSCH0pKtexIMREx09pbgKRonheQoPbTUFZ5Ic8XWsAoTs4/sVsLMYTYNMiJI2+kV7XxBSMuP1NK7Vyou07uU9LKxd3kbxLGaO/6kkb5H0nhXuIMQKBgQDk35/CnSh10eUIZLrUAuQYQKSwOjFl/y2JE2jljMKaZ/PW6krU95crLznLWA2SzKJqrIQc1aXfwf5CwaG6vq9jRK2CTwDHheLEA1Nk0O7h0+CWU9GGsuU3ZbB6d9+MjlLecJDObb7NogKRpn82OEWIqH+U/o1iwK0nNQshOsdLawKBgQDOHnmTItL+a7USCRVpTtCykzAO8k67ZE0ExB+BJpDP1UKmgksnuepaf6aC1RHO1nTo2I4OVp/VxQ5T3Zug4jZLHY9L64fuP0IPH/cIggpu+b08UajWq7COyHlIfbbvlIuZF0alHfzcS6GIxBK8z1CIdUVU5h2rXBa16PVDLbjw8wKBgDIfBs2HvSSQIqgD5yYmu+zTuz0cgVTk3QP3zDD48mT9/thB1sFstx4t6WoujkpnpenWfdgSsZCe2x+jZ9eNirsifxzaUEFhgJeMYubhGm86ByTkli35X1kSW+N1/O66/EraO9v5DJ/bqtRaseEd0ZxrygTG+g92QnUjmJxeUuahAoGBAMiLxDRRvMMI3uuGZQvKQKqPJUJVph8TzxAlFpYdhOaCk8/Yk/E6JfgZnVRMpX//D08CbO0sgWWHzpHw25xknPjm8OaoauB3MfnvWvcvN6GUYffPaBw+fpHeIotSrexbNpwklnrPO5jICYo9ZBHLEItEtsmNAC8bcYla+U98rCXbAoGBAMMKuwTj1wh8CCFIjdePpImhQguh530pVgShqujXxB8W2l0wUlxjsrLG/guKNcgPfHLHVwpis0YuIBpwzk04hj4psnAYPu5wGl6KceLYdfRYrJoQbhrc08xPogc4DhQOatVHn9kKI//wpR3a59yPyY3tMd18e9bNgsW4CPT7Tmxr
PublicKey:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuEcxdJFTCLQlMtm60T6ZfbL9c3c2tF5+f5AFKhO2JJt81PdrRWaQl/WK7CqeHMRAvLsKLRImxN6m4fJRjfhtaWuebe2Jl9JTlui+8ec+XjEsdifKEO6qQAN6T0armYPOZHvLYSSSaZwi4GCQGYZU0oCrwc8BAsvffEaVfHqkQ5a+tAR/hnIAmuci8juzv5fYc04IqZApHVyseF++C4pXwAxT4VYAucv9N0UJxV3Jq342zpS8SMnn+Geelnl6O8wLsUhtmEdccrd67qcRdbiAZ/F27i+43beMIEBdCVcZhgdUljMxu69y8sTyG5xDAIgP/4jUlHygjUbmTiMmpcjmkQIDAQAB
hello rsa!
hello rsa!
CCnsnslB08p1E4aMdK5BNi9ZwRkGPj1bvnMrIn0LNsiTmc4r06rE5lbB9Tz3C9W50jnQBHyMI6TBFkU6cyUeDAAFzHI/PLgKw2hCd76DX0o7BuknNTUZ6yuHmQQEyFp0CMrb1sUkKtUv0aq+4nqJwGbZ9v3LLoPmKl/oD/LYD0tciWBkskoGOKxF2izosY71lWyFZV6OtQYQbdo39TcHJh9eeqM1/4JeLFm2+wnnOF+1j2AR+Ki1WNeAtXcDAQHqz1GmKgg46FlycD/xlxzoWgega6BpjyiHIh1vIMK24PztP9PwibmsZliBUB3V4+iyaTTVXTUkatFo0RALNs902A==trueProcess finished with exit code 0

工具类RSAUtil

import java.io.ByteArrayOutputStream;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.*;import java.util.Base64;
import java.util.HashMap;
import java.util.Map;import javax.crypto.Cipher;/*** RSA 加密 工具类*/
public abstract class RSAUtil {public static final String KEY_ALGORITHM = "RSA";public static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";public static final String PUBLIC_KEY = "RSAPublicKey";public static final String PRIVATE_KEY = "RSAPrivateKey";public static String sign(byte[] data, String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException, SignatureException, InvalidKeyException {// 解密由base64编码的私钥byte[] keyBytes = Base64.getDecoder().decode(privateKey);// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私钥匙对象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 用私钥对信息生成数字签名Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(priKey);signature.update(data);return Base64.getEncoder().encodeToString(signature.sign());}/*** 校验数字签名*/public static boolean verify(byte[] data, String publicKey, String sign)throws Exception {// 解密由base64编码的公钥byte[] keyBytes = Base64.getDecoder().decode(publicKey);// 构造X509EncodedKeySpec对象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取公钥匙对象PublicKey pubKey = keyFactory.generatePublic(keySpec);Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initVerify(pubKey);signature.update(data);// 验证签名是否正常return signature.verify(Base64.getDecoder().decode(sign));}/*** 解密<br>* 用私钥解密*/public static byte[] decryptByPrivateKey(byte[] data, String key)throws Exception {byte[] decryptedData = null;// 对密钥解密byte[] keyBytes = Base64.getDecoder().decode(key);// 取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);int maxDecryptBlockSize = getMaxDencryptBytesByPrivate(keyFactory, privateKey);ByteArrayOutputStream bout = new ByteArrayOutputStream();try {int dataLength = data.length;for (int i = 0; i < dataLength; i += maxDecryptBlockSize) {int decryptLength = Math.min(dataLength - i, maxDecryptBlockSize);byte[] doFinal = cipher.doFinal(data, i, decryptLength);bout.write(doFinal);}decryptedData = bout.toByteArray();} finally {bout.close();}return decryptedData;}/*** 将Base64编码的密文解密为字符串*/public static String decryptByPrivateKeyToString(String base64Str, String key) throws Exception {byte[] data = Base64.getDecoder().decode(base64Str);byte[] oriData = decryptByPrivateKey(data, key);return new String(oriData);}/*** 获取公钥加密可加密的最大数据字节长度*/private static int getMaxEncryptBytesByPublicKey(KeyFactory keyFactory, Key key) throws InvalidKeySpecException {return getPublicKeyBitLength(keyFactory, key) / 8 - 11;}/*** 获取公钥解密每块的字节长度*/private static int getMaxDencryptBytesByPrivate(KeyFactory keyFactory, Key key) throws InvalidKeySpecException {return getPrivateKeyBitLength(keyFactory, key) / 8;}/*** 获取公钥加密可加密的最大数据字节长度*/private static int getMaxEncryptBytesByPrivate(KeyFactory keyFactory, Key key) throws InvalidKeySpecException {return getPrivateKeyBitLength(keyFactory, key) / 8 - 11;}/*** 获取公钥解密每块的字节长度*/private static int getMaxDencryptBytesByPublicKey(KeyFactory keyFactory, Key key) throws InvalidKeySpecException {return getPublicKeyBitLength(keyFactory, key) / 8;}/*** 获取公钥的字节长度*/private static int getPublicKeyBitLength(KeyFactory keyFactory, Key key) throws InvalidKeySpecException {RSAPublicKeySpec publicKeySpec = keyFactory.getKeySpec(key, RSAPublicKeySpec.class);return publicKeySpec.getModulus().bitLength();}/*** 获取私钥的字节长度*/private static int getPrivateKeyBitLength(KeyFactory keyFactory, Key key) throws InvalidKeySpecException {RSAPrivateKeySpec publicKeySpec = keyFactory.getKeySpec(key, RSAPrivateKeySpec.class);return publicKeySpec.getModulus().bitLength();}/*** 解密<br>* 用公钥解密*/public static byte[] decryptByPublicKey(byte[] data, String key)throws Exception {byte[] decryptedData = null;// 对密钥解密byte[] keyBytes = Base64.getDecoder().decode(key);// 取得公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, publicKey);int maxDecryptBlockSize = getMaxDencryptBytesByPublicKey(keyFactory, publicKey);ByteArrayOutputStream bout = new ByteArrayOutputStream();try {int dataLength = data.length;for (int i = 0; i < dataLength; i += maxDecryptBlockSize) {int decryptLength = Math.min(dataLength - i, maxDecryptBlockSize);byte[] doFinal = cipher.doFinal(data, i, decryptLength);bout.write(doFinal);}decryptedData = bout.toByteArray();} finally {bout.close();}return decryptedData;}/*** 加密<br>* 用公钥加密*/public static byte[] encryptByPublicKey(byte[] data, String key)throws Exception {byte[] encryptedData = null;// 对公钥解密byte[] keyBytes = Base64.getDecoder().decode(key);// 取得公钥X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicKey = keyFactory.generatePublic(x509KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);int maxEncryptBlockSize = getMaxEncryptBytesByPublicKey(keyFactory, publicKey);ByteArrayOutputStream bout = new ByteArrayOutputStream();try {int dataLength = data.length;for (int i = 0; i < data.length; i += maxEncryptBlockSize) {int encryptLength = Math.min(dataLength - i, maxEncryptBlockSize);byte[] doFinal = cipher.doFinal(data, i, encryptLength);bout.write(doFinal);}encryptedData = bout.toByteArray();} finally {bout.close();}return encryptedData;}/*** 加密<br>* 用私钥加密*/public static byte[] encryptByPrivateKey(byte[] data, String key)throws Exception {byte[] encryptedData = null;// 对密钥解密byte[] keyBytes = Base64.getDecoder().decode(key);// 取得私钥PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);// 对数据加密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, privateKey);int maxEncryptBlockSize = getMaxEncryptBytesByPrivate(keyFactory, privateKey);ByteArrayOutputStream bout = new ByteArrayOutputStream();try {int dataLength = data.length;for (int i = 0; i < data.length; i += maxEncryptBlockSize) {int encryptLength = Math.min(dataLength - i, maxEncryptBlockSize);byte[] doFinal = cipher.doFinal(data, i, encryptLength);bout.write(doFinal);}encryptedData = bout.toByteArray();} finally {bout.close();}return encryptedData;}/*** 取得私钥*/public static String getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return Base64.getEncoder().encodeToString(key.getEncoded());}/*** 取得公钥*/public static String getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return Base64.getEncoder().encodeToString(key.getEncoded());}/*** 初始化密钥*/public static Map<String, Object> initKey() throws Exception {return initKey(1024);}public static Map<String, Object> initKey(int keySize) throws Exception {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);keyPairGen.initialize(keySize);KeyPair keyPair = keyPairGen.generateKeyPair();// 公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();// 私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}/*** 测试*/public static void main(String[] args) {try {//生成公钥私钥Map<String, Object> map = RSAUtil.initKey(2048);String PrivateKey = RSAUtil.getPrivateKey(map);String PublicKey = RSAUtil.getPublicKey(map);System.out.println("PrivateKey:" + PrivateKey);System.out.println("PublicKey:" + PublicKey);//明文String data = "hello rsa!";//公钥加密私钥解密byte[] encData = RSAUtil.encryptByPublicKey(data.getBytes(), PublicKey);byte[] decData = RSAUtil.decryptByPrivateKey(encData, PrivateKey);System.out.println(new String(decData));//私钥加密公钥解密byte[] encData1 = RSAUtil.encryptByPrivateKey(data.getBytes(), PrivateKey);byte[] decData1 = RSAUtil.decryptByPublicKey(encData1, PublicKey);System.out.println(new String(decData1));//私钥签名公钥验签String signStr = RSAUtil.sign(data.getBytes(), PrivateKey);boolean verify = RSAUtil.verify(data.getBytes(), PublicKey, signStr);System.out.println(signStr + verify);} catch (Exception e) {//密钥不对等情况e.printStackTrace();}}}

分享一个RSA加解密工具类,公钥加密私钥解密、私钥加密公钥解密、私钥签名公钥验签、生成公钥私钥相关推荐

  1. 分享一个Joda-Time日期时间工具类

    写在前面 在JDK1.8之前,处理日期和时间的方式比较单一,Java中提供了Calendar来处理日期,但是过程较为繁琐. 但是在JDK1.8之后,Java更新了time包提供了LocalDate,L ...

  2. 分享一个文件上传工具类

    文件上传状态枚举类: View Code 1 package com.hoo.enums; 2 3 4 5 /** 6 7 * <b>function:</b> 文件上传状态 ...

  3. RSA加解密工具类(PKCS8公钥加密,PKCS1私钥解密)

    场景:如果项目上生成的秘钥,公钥是PKCS8格式,私钥却是PKCS1格式.需要在这种场景加解密的话可以直接使用下面工具类. 依赖 <dependency><groupId>or ...

  4. rsa java ao_RSA加解密工具类

    Java 实现 import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairG ...

  5. java aes 工具类_Java中的AES加解密工具类:AESUtils

    本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...

  6. android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。

    Encrypt(加密工具) 字符串,byte[],文件等对象的加密和解密工具集合,包含了多种加密方案. 加密类型 摘要 相关方法 简单加密 换一种编码格式 Base64Util 单向加密 只能加密,不 ...

  7. Java各种方式加解密工具类

    文章目录 前言 1.AES 2.DES 3.BCrypt 4.Http Basic 5.MD5 6.RSA 7.SHA256 8.SM3 9.SM4 前言 JAVA能够实现各种加解密方式,这里对各种加 ...

  8. Java 加解密工具类

    一.对称加密算法  加密和解密使用相同密钥的加密算法.常用的算法包括DES.3DES.AES.DESX.Blowfish.RC4.RC5.RC6. DES(Data Encryption Standa ...

  9. 阿里云专属KMS信封加解密工具类

    此工具类主要实现,字符串的加密,输出为Base64编码的字符串.字符串的解密,输入为Base64编码的字符串.工具类里的IV向量参数,需要用户自己保存,工具类中是默认写死在代码中的,并不规范.IV向量 ...

最新文章

  1. 机房收费系统【VB版】——添加和删除用户
  2. Java培训哪家机构好
  3. Cisco2811基本操作
  4. Javaweb权限管理设计思路
  5. 磁盘显示执行页内操作时的错误要如何找到资料
  6. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症
  7. HTML5背景音乐的暂停与播放
  8. 【报告分享】2019年中国数字经济发展指数.pdf(附下载链接)
  9. aws rds监控慢sql_在AWS RDS SQL Server上使用SSIS包
  10. 杨超越吧编程大赛;拼多多刷单?苹果新员工一半没本科学历 | 极客头条
  11. iphone已停用怎么解锁_iPhone多次输错密码已停用,连接iTunes,怎么办?
  12. python编程示例_Python套接字编程–服务器,客户端示例
  13. Deskew Technologies Gig Performer 4 Mac - 现场调音机架
  14. html直线动画,HTML5 Canvas流动线条动画特效
  15. jdbc mysql url写法_详解数据库连接的URL的写法及总结
  16. Windows Server 2012 R2 Standard 安全加固
  17. 幂乘法求最大特征值和特征向量
  18. JSD-2204-API-线程并发-集合-Day08
  19. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解
  20. 某计算机系统的内存储器由cache,计算机组成原理习题课1讲解

热门文章

  1. 缓存cookie与session的清理,cookie和session在浏览器清理缓存是发生的事件
  2. Halcon知识:gray_tophat 顶帽变换和底帽变换
  3. 怎么退出自适应巡航_你的自适应巡航“全速”了吗?
  4. Mac用Visual Studio Code编写C/C++安装配置教程
  5. C# 流不可读 解决办法
  6. “燕云十六将”之毛毛杜倩(7)
  7. nginx反向代理非80端口/nginx反代非80端口
  8. acer台式电脑怎么重装系统_手把手教你宏碁台式机如何重装系统
  9. 如何做浏览器兼容性测试?教你几招
  10. 久坐伤身,这个3D坐垫能让危害降到最低,办公自驾必备!