异常如下

1.javax.crypto.BadPaddingException: Given final block not properly padded

1)要确认下是否加密和解密都是使用相同的填充算法(也就是说,是否都是使用PKCS5Padding)2)确认下你要解密的字节数组是否正确。

javax.crypto.IllegalBlockSizeException:

Input length must be multiple of 8 when decrypting with padded cipher

输入长度必须是8的倍数时,解密密文

一、java中简单的加密解密过程

package mai.util;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

public class ThreeDES {

private static final String Algorithm = "DESede"; //定义 加密算法,可用 DES,DESede,Blowfish

//keybyte为加密密钥,长度为24字节

//src为被加密的数据缓冲区(源)

public static byte[] encryptMode(byte[] keybyte, byte[] src) {

try {

//生成密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

//加密

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.ENCRYPT_MODE, deskey);

return c1.doFinal(src);

} catch (java.security.NoSuchAlgorithmException e1) {

e1.printStackTrace();

} catch (javax.crypto.NoSuchPaddingException e2) {

e2.printStackTrace();

} catch (java.lang.Exception e3) {

e3.printStackTrace();

}

return null;

}

//keybyte为加密密钥,长度为24字节

//src为加密后的缓冲区

public static byte[] decryptMode(byte[] keybyte, byte[] src) {

try {

//生成密钥

SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);

//解密

Cipher c1 = Cipher.getInstance(Algorithm);

c1.init(Cipher.DECRYPT_MODE, deskey);

return c1.doFinal(src);

} catch (java.security.NoSuchAlgorithmException e1) {

e1.printStackTrace();

} catch (javax.crypto.NoSuchPaddingException e2) {

e2.printStackTrace();

} catch (java.lang.Exception e3) {

e3.printStackTrace();

}

return null;

}

//转换成十六进制字符串

public static String byte2hex(byte[] b) {

String hs="";

String stmp="";

for (int n=0;n<b.length;n++) {

stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));

if (stmp.length()==1) hs=hs+"0"+stmp;

else hs=hs+stmp;

if (n<b.length-1)  hs=hs+":";

}

return hs.toUpperCase();

}

public static void main(String[] args)

{

//添加新安全算法,如果用JCE就要把它添加进去

Security.addProvider(new com.sun.crypto.provider.SunJCE());

final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58, (byte)0x88, 0x10, 0x40, 0x38

, 0x28, 0x25, 0x79, 0x51, (byte)0xCB, (byte)0xDD, 0x55, 0x66

, 0x77, 0x29, 0x74, (byte)0x98, 0x30, 0x40, 0x36, (byte)0xE2};    //24字节的密钥

String szSrc = "This is a 3DES test. 测试";

System.out.println("加密前的字符串:" + szSrc);

byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());

System.out.println("加密后的字符串:" + new String(encoded));

byte[] srcBytes = decryptMode(keyBytes, encoded);

System.out.println("解密后的字符串:" + (new String(srcBytes)));

}

}

http://www.cnblogs.com/mailingfeng/archive/2011/07/29/2120507.html

二、Android: JAVA和C# 3DES加密解密

这里的KEY采用Base64编码,便用分发,因为Java的Byte范围为-128至127,c#的Byte范围是0-255
核心是确定Mode和Padding,关于这两个的意思可以搜索3DES算法相关文章
一个是C#采用CBC
Mode,PKCS7 Padding,Java采用CBC Mode,PKCS5Padding Padding,
另一个是C#采用ECB
Mode,PKCS7 Padding,Java采用ECB Mode,PKCS5Padding
Padding,
Java的ECB模式不需要IV
对字符加密时,双方采用的都是UTF-8编码

下面是C#代码

///<summary>
/// DES3加密解密
///</summary>
publicclass Des3
   {
#region CBC模式**

///<summary>
/// DES3 CBC模式加密
///</summary>
///<param name="key">密钥</param>
///<param name="iv">IV</param>
///<param name="data">明文的byte数组</param>
///<returns>密文的byte数组</returns>
publicstaticbyte[] Des3EncodeCBC( byte[] key, byte[] iv, byte[] data )
       {
//复制于MSDN

try
           {
// Create a MemoryStream.
               MemoryStream mStream = new MemoryStream();

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
               tdsp.Mode = CipherMode.CBC;             //默认值
               tdsp.Padding = PaddingMode.PKCS7;       //默认值

// Create a CryptoStream using the MemoryStream
// and the passed key and initialization vector (IV).
               CryptoStream cStream = new CryptoStream( mStream,
                   tdsp.CreateEncryptor( key, iv ),
                   CryptoStreamMode.Write );

// Write the byte array to the crypto stream and flush it.
               cStream.Write( data, 0, data.Length );
               cStream.FlushFinalBlock();

// Get an array of bytes from the
// MemoryStream that holds the
// encrypted data.
byte[] ret = mStream.ToArray();

// Close the streams.
               cStream.Close();
               mStream.Close();

// Return the encrypted buffer.
return ret;
           }
catch ( CryptographicException e )
           {
               Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
returnnull;
           }
       }

///<summary>
/// DES3 CBC模式解密
///</summary>
///<param name="key">密钥</param>
///<param name="iv">IV</param>
///<param name="data">密文的byte数组</param>
///<returns>明文的byte数组</returns>
publicstaticbyte[] Des3DecodeCBC( byte[] key, byte[] iv, byte[] data )
       {
try
           {
// Create a new MemoryStream using the passed
// array of encrypted data.
               MemoryStream msDecrypt = new MemoryStream( data );

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
               tdsp.Mode = CipherMode.CBC;
               tdsp.Padding = PaddingMode.PKCS7;

// Create a CryptoStream using the MemoryStream
// and the passed key and initialization vector (IV).
               CryptoStream csDecrypt = new CryptoStream( msDecrypt,
                   tdsp.CreateDecryptor( key, iv ),
                   CryptoStreamMode.Read );

// Create buffer to hold the decrypted data.
byte[] fromEncrypt = newbyte[data.Length];

// Read the decrypted data out of the crypto stream
// and place it into the temporary buffer.
               csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length );

//Convert the buffer into a string and return it.
return fromEncrypt;
           }
catch ( CryptographicException e )
           {
               Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
returnnull;
           }
       }

#endregion

#region ECB模式

///<summary>
/// DES3 ECB模式加密
///</summary>
///<param name="key">密钥</param>
///<param name="iv">IV(当模式为ECB时,IV无用)</param>
///<param name="str">明文的byte数组</param>
///<returns>密文的byte数组</returns>
publicstaticbyte[] Des3EncodeECB( byte[] key, byte[] iv, byte[] data )
       {
try
           {
// Create a MemoryStream.
               MemoryStream mStream = new MemoryStream();

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
               tdsp.Mode = CipherMode.ECB;
               tdsp.Padding = PaddingMode.PKCS7;
// Create a CryptoStream using the MemoryStream
// and the passed key and initialization vector (IV).
               CryptoStream cStream = new CryptoStream( mStream,
                   tdsp.CreateEncryptor( key, iv ),
                   CryptoStreamMode.Write );

// Write the byte array to the crypto stream and flush it.
               cStream.Write( data, 0, data.Length );
               cStream.FlushFinalBlock();

// Get an array of bytes from the
// MemoryStream that holds the
// encrypted data.
byte[] ret = mStream.ToArray();

// Close the streams.
               cStream.Close();
               mStream.Close();

// Return the encrypted buffer.
return ret;
           }
catch ( CryptographicException e )
           {
               Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
returnnull;
           }

}

///<summary>
/// DES3 ECB模式解密
///</summary>
///<param name="key">密钥</param>
///<param name="iv">IV(当模式为ECB时,IV无用)</param>
///<param name="str">密文的byte数组</param>
///<returns>明文的byte数组</returns>
publicstaticbyte[] Des3DecodeECB( byte[] key, byte[] iv, byte[] data )
       {
try
           {
// Create a new MemoryStream using the passed
// array of encrypted data.
               MemoryStream msDecrypt = new MemoryStream( data );

TripleDESCryptoServiceProvider tdsp = new TripleDESCryptoServiceProvider();
               tdsp.Mode = CipherMode.ECB;
               tdsp.Padding = PaddingMode.PKCS7;

// Create a CryptoStream using the MemoryStream
// and the passed key and initialization vector (IV).
               CryptoStream csDecrypt = new CryptoStream( msDecrypt,
                   tdsp.CreateDecryptor( key, iv ),
                   CryptoStreamMode.Read );

// Create buffer to hold the decrypted data.
byte[] fromEncrypt = newbyte[data.Length];

// Read the decrypted data out of the crypto stream
// and place it into the temporary buffer.
               csDecrypt.Read( fromEncrypt, 0, fromEncrypt.Length );

//Convert the buffer into a string and return it.
return fromEncrypt;
           }
catch ( CryptographicException e )
           {
               Console.WriteLine( "A Cryptographic error occurred: {0}", e.Message );
returnnull;
           }
       }

#endregion

///<summary>
/// 类测试
///</summary>
publicstaticvoid Test()
       {
           System.Text.Encoding utf8 = System.Text.Encoding.UTF8;

//key为abcdefghijklmnopqrstuvwx的Base64编码
byte[] key = Convert.FromBase64String( "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4" );
byte[] iv = newbyte[] { 1, 2, 3, 4, 5, 6, 7, 8 };      //当模式为ECB时,IV无用
byte[] data = utf8.GetBytes( "中国ABCabc123" );

System.Console.WriteLine( "ECB模式:" );
byte[] str1 = Des3.Des3EncodeECB( key, iv, data );
byte[] str2 = Des3.Des3DecodeECB( key, iv, str1 );
           System.Console.WriteLine( Convert.ToBase64String( str1 ) );
           System.Console.WriteLine( System.Text.Encoding.UTF8.GetString( str2 ) );

System.Console.WriteLine();

System.Console.WriteLine( "CBC模式:" );
byte[] str3 = Des3.Des3EncodeCBC( key, iv, data );
byte[] str4 = Des3.Des3DecodeCBC( key, iv, str3 );
           System.Console.WriteLine( Convert.ToBase64String( str3 ) );
           System.Console.WriteLine( utf8.GetString( str4 ) );

System.Console.WriteLine();

}

}

接着是Java代码

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

publicclass Des3 {
publicstaticvoid main(String[] args) throws Exception {

byte[] key=new BASE64Decoder().decodeBuffer("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4");
byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };

byte[] data="中国ABCabc123".getBytes("UTF-8");

System.out.println("ECB加密解密");
byte[] str3 = des3EncodeECB(key,data );
byte[] str4 = ees3DecodeECB(key, str3);
       System.out.println(new BASE64Encoder().encode(str3));
       System.out.println(new String(str4, "UTF-8"));

System.out.println();

System.out.println("CBC加密解密");
byte[] str5 = des3EncodeCBC(key, keyiv, data);
byte[] str6 = des3DecodeCBC(key, keyiv, str5);
       System.out.println(new BASE64Encoder().encode(str5));
       System.out.println(new String(str6, "UTF-8"));

}

/**
    * ECB加密,不要IV
    * @param key 密钥
    * @param data 明文
    * @return Base64编码的密文
    * @throws Exception
*/
publicstaticbyte[] des3EncodeECB(byte[] key, byte[] data)
throws Exception {

Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");

cipher.init(Cipher.ENCRYPT_MODE, deskey);
byte[] bOut = cipher.doFinal(data);

return bOut;
   }

/**
    * ECB解密,不要IV
    * @param key 密钥
    * @param data Base64编码的密文
    * @return 明文
    * @throws Exception
*/
publicstaticbyte[] ees3DecodeECB(byte[] key, byte[] data)
throws Exception {

Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");

cipher.init(Cipher.DECRYPT_MODE, deskey);

byte[] bOut = cipher.doFinal(data);

return bOut;

}

/**
    * CBC加密
    * @param key 密钥
    * @param keyiv IV
    * @param data 明文
    * @return Base64编码的密文
    * @throws Exception
*/
publicstaticbyte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data)
throws Exception {

Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
       IvParameterSpec ips = new IvParameterSpec(keyiv);
       cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
byte[] bOut = cipher.doFinal(data);

return bOut;
   }

/**
    * CBC解密
    * @param key 密钥
    * @param keyiv IV
    * @param data Base64编码的密文
    * @return 明文
    * @throws Exception
*/
publicstaticbyte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data)
throws Exception {

Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
       IvParameterSpec ips = new IvParameterSpec(keyiv);

cipher.init(Cipher.DECRYPT_MODE, deskey, ips);

byte[] bOut = cipher.doFinal(data);

return bOut;

}

}

下面是运行结果

ECB模式:
rmWB4+r9Ug93WI0KAEuMig==
中国ABCabc123

CBC模式:
4aabWF8UFour/vNfnzJrjw==
中国ABCabc123

另外,android下要使用3DES可考虑将BASE64Encoder替换成Base64

代码如下:

publicstaticvoid main(String[] args) throws Exception {

byte[] key=Base64.decode("YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4".getBytes(),Base64.DEFAULT);
byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };

byte[] data="中国ABCabc123".getBytes("UTF-8");

System.out.println("ECB加密解密");
byte[] str3 = des3EncodeECB(key,data );
byte[] str4 = ees3DecodeECB(key, str3);
       System.out.println(new String(Base64.encode(str3,  Base64.DEFAULT),"UTF-8"));
       System.out.println(new String(str4, "UTF-8"));

System.out.println();

System.out.println("CBC加密解密");
byte[] str5 = des3EncodeCBC(key, keyiv, data);
byte[] str6 = des3DecodeCBC(key, keyiv, str5);
       System.out.println(new String(Base64.encode(str5,  Base64.DEFAULT),"UTF-8"));
       System.out.println(new String(str6, "UTF-8"));
   }

原文:http://www.byywee.com/page/M0/S544/544514.html

三、java和php对等的3DES加密算法

java代码:

package org.jamie.demo;

import java.security.NoSuchAlgorithmException;

import java.security.Security;

import java.util.Random;

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.DESedeKeySpec;

import javax.crypto.spec.IvParameterSpec;

@SuppressWarnings("restriction")

public class TripleDES {

static {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

}

private static final String MCRYPT_TRIPLEDES = "DESede";

private static final String TRANSFORMATION = "DESede/CBC/PKCS5Padding";

public static byte[] decrypt(byte[] data, byte[] key, byte[] iv) throws Exception {

DESedeKeySpec spec = new DESedeKeySpec(key);

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(MCRYPT_TRIPLEDES);

SecretKey sec = keyFactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance(TRANSFORMATION);

IvParameterSpec IvParameters = new IvParameterSpec(iv);

cipher.init(Cipher.DECRYPT_MODE, sec, IvParameters);

return cipher.doFinal(data);

}

public static byte[] encrypt(byte[] data, byte[] key, byte[] iv) throws Exception {

DESedeKeySpec spec = new DESedeKeySpec(key);

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");

SecretKey sec = keyFactory.generateSecret(spec);

Cipher cipher = Cipher.getInstance(TRANSFORMATION);

IvParameterSpec IvParameters = new IvParameterSpec(iv);

cipher.init(Cipher.ENCRYPT_MODE, sec, IvParameters);

return cipher.doFinal(data);

}

public static byte[] generateSecretKey() throws NoSuchAlgorithmException {

KeyGenerator keygen = KeyGenerator.getInstance(MCRYPT_TRIPLEDES);

return keygen.generateKey().getEncoded();

}

public static byte[] randomIVBytes() {

Random ran = new Random();

byte[] bytes = new byte[8];

for (int i = 0; i < bytes.length; ++i) {

bytes[i] = (byte) ran.nextInt(Byte.MAX_VALUE + 1);

}

return bytes;

}

public static void main(String args[]) throws Exception {

String plainText = "a12*&1c中文";

final byte[] secretBytes = TripleDES.generateSecretKey();

final byte[] ivbytes = TripleDES.randomIVBytes();

System.out.println("plain text: " + plainText);

byte[] encrypt = TripleDES.encrypt(plainText.getBytes(), secretBytes, ivbytes);

System.out.println("cipher text: " + encrypt);

System.out.println("decrypt text: " + new String(TripleDES.decrypt(encrypt, secretBytes, ivbytes), "UTF-8"));

}

}

Php代码

<?php

class TripleDES {

public static function genIvParameter() {

return mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_TRIPLEDES,MCRYPT_MODE_CBC), MCRYPT_RAND);

}

private static function pkcs5Pad($text, $blocksize) {

$pad = $blocksize - (strlen($text) % $blocksize); // in php, strlen returns the bytes of $text

return $text . str_repeat(chr($pad), $pad);

}

private static function pkcs5Unpad($text) {

$pad = ord($text{strlen($text)-1});

if ($pad > strlen($text)) return false;

if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;

return substr($text, 0, -1 * $pad);

}

public static function encryptText($plain_text, $key, $iv) {

$padded = TripleDES::pkcs5Pad($plain_text, mcrypt_get_block_size(MCRYPT_TRIPLEDES, MCRYPT_MODE_CBC));

return mcrypt_encrypt(MCRYPT_TRIPLEDES, $key, $padded, MCRYPT_MODE_CBC, $iv);

}

public static function decryptText($cipher_text, $key, $iv) {

$plain_text = mcrypt_decrypt(MCRYPT_TRIPLEDES, $key, $cipher_text, MCRYPT_MODE_CBC, $iv);

return TripleDES::pkcs5Unpad($plain_text);

}

};

/*

function main() {

$iv = TripleDES::genIvParameter();

print "\$iv=$iv\n";

$plain_text="this is a test,包括中文";

$key="ABCDEFGHIJ0123456789ABCD";

$cipher_text = TripleDES::encryptText($plain_text, $key, $iv);

print "\$cipher_text=$cipher_text\n";

$plain_text = TripleDES::decryptText($cipher_text, $key, $iv);

print "\$plain_text=$plain_text\n";

}

main();

*/

?>

转载于:https://blog.51cto.com/4789781/1215585

java之php、Android、JAVA、C# 3DES加密解密相关推荐

  1. java 3des加密_Java使用3DES加密解密的流程 - 3des加密解密详细解释

    Java使用3DES加密解密的流程 ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象 SecretKey deskey = new Secret ...

  2. Java中3DES加密解密示例

    在java中调用sun公司提供的3DES加密解密算法时,需要使用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: jce.jar security/US_export_policy. ...

  3. Java实现3DES加密解密(DESede/ECB/PKCS5Padding使用)

    一.简介 3DES(又叫Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称. 它相当于是对每个数据块应用三次DES加密算 ...

  4. java 3des_如何用Java进行3DES加密解密 java实现3des加密解密教程

    3des,全称为3DESede或TripleDES,中文解释为是三重数据加密,用户可以通过通过对DES算法进行改进,针对每个数据块进行三次DES加密,下面小编为你带来java实现3des加密解密教程! ...

  5. 用java实现3DES加密解密算法

    3DES加密也称三重加密,其底层加密算法与DES相同,只不过它的密钥长度是168位.由于在DES加密算法中,64位密钥中每一个字节的第8位是奇偶校验位,所以每个字节中只有后7位起密钥作用,实际是56位 ...

  6. 使用Java实现3DES加密解密

    1. 介绍 3DES又称Triple DES,是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法 ...

  7. Vue前端和Java后端 联调使用AES 前后端加密解密

    Vue前端和Java后端 联调使用AES 前后端加密解密 最近在项目中需要针对重要数据进行加密传输,在网上找了一大推加密方式 最终采用AES 加密 Java端 package com.zk.web.u ...

  8. Android 平台DES IV 加密解密随笔

    Android 平台DES IV 加密解密随笔 DES加密接触过好多次了,但总容易忘,和服务器交互时,加出来不一致后面能解密成功但是头部是乱码导致小坑了一会,这次记录下来~ 根据网上资料和自己的理解, ...

  9. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

最新文章

  1. 怎么给电脑设密码_怎么给电脑中重要的文件夹设置密码?
  2. c语言16x32点阵显示汉字,点阵16*32滚屏显示汉字
  3. grep命令---Linux学习笔记
  4. wifi传输信息需要连接服务器,基于近场通信的WiFi传输连接方案.pdf
  5. 如何在centos上安装epel源
  6. C# List集合求交集
  7. php1500,圆周率1500多位
  8. MDF /IDF名词解析
  9. input眼睛显示 vue_2019前端面试题汇总(主要为Vue)
  10. 如何通过git客户端上传项目到github上
  11. 面向对象编程——实战1
  12. 断言assert的使用
  13. [iOS]Mac系统下安装windows共享打印机采坑记
  14. 永中office linux卸载,永中office Linux版
  15. win10系统访问共享文件速度过慢的解决方法
  16. DTCloud 报表格式
  17. IntelliJ IDEA 创建普通 JavaSE 项目
  18. bga封装扇出_电路板设计BGA芯片扇出功能教程
  19. 约瑟夫环问题的几种解法
  20. java特种兵有没有下册,java特种兵

热门文章

  1. mongodb使用常用语法,持续更新
  2. 前端编程提高之旅(五)----写给大家看的css书
  3. 超过80%的自媒体月收入不足万元,2017年做自媒体还有赚钱的机会吗?
  4. 推荐一个学习golang的地址
  5. javascript断点调试方法
  6. 构建RHEL上的extmail
  7. framer x使用教程_如何使用Framer Motion将交互式动画和页面过渡添加到Next.js Web应用程序
  8. 软件访问转向本地_我是如何从完整的初学者转向软件开发人员的,以及如何做到的...
  9. gitter 卸载_最佳Gitter频道:VR和AR
  10. OpenStack环境搭建(一:Virtual Box 5.1 环境的安装及配置)