最近做东西时,用到密码的加密存储问题,转一个加密工具
/* * Created on 2003-10-20 by Liudong. */ package lius.crypto.DES; import java.security.*; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; /** * 实现DES加密和解密的过程 * @author Liudong */ public class DESCipher { private final static String DES = "DES"; /** * 加密 * @param src 数据源 * @param key 密钥,长度必须是8的倍数 * @return 返回加密后的数据 * @throws Exception */ public static byte[] encrypt(byte[] src, byte[] key) throws Exception { //DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密匙工厂,然后用它把DESKeySpec转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成加密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr); // 现在,获取数据并加密 // 正式执行加密操作 return cipher.doFinal(src); } /** * 解密 * @param src 数据源 * @param key 密钥,长度必须是8的倍数 * @return 返回解密后的原始数据 * @throws Exception */ public static byte[] decrypt(byte[] src, byte[] key) throws Exception { // DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); // 从原始密匙数据创建一个DESKeySpec对象 DESKeySpec dks = new DESKeySpec(key); // 创建一个密匙工厂,然后用它把DESKeySpec对象转换成 // 一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey securekey = keyFactory.generateSecret(dks); // Cipher对象实际完成解密操作 Cipher cipher = Cipher.getInstance(DES); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, securekey, sr); // 现在,获取数据并解密 // 正式执行解密操作 return cipher.doFinal(src); } /** * 二进制转字符串 * @param b * @return */ private 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(); } /** * 测试入口 * @param args */ public static void main(String[] args) throws Exception{ byte[] key = "Hello123".getBytes(); byte[] src = "你好,中国".getBytes(); byte[] des = encrypt(src,key); System.out.println(byte2hex(des)); des = decrypt(des,key); System.out.println(byte2hex(des)); System.out.println(new String(des)); } }
1)編碼 消息長度(short int-->2個字節) + 消息編號(short int--》2個字節) + 消息體 2)Protobuf協議文檔 (1)syntax="proto3"; (2)命名格式
本文分享自華爲雲社區《10分鐘搞懂各種內存溢出案例!!(含完整源碼,建議收藏)》,作者:冰 河。 作爲程序員,多多少少都會遇到一些內存溢出的場景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個假程序員!哈哈,開個玩笑。今天,我
Ai technology 前言 AppBuilder上線了低代碼製作組件功能,可以通過工作流的方式構建自定義組件,完成簡單Agent無法完成的複雜功能,使得生成的文本更加定製化,
最近在刷一些問題的時候看到有下面一個問題 上面問的是當輸入的字符串爲什麼的時候返回 True 總結 在做題目的時候,第一次還做錯了。 這是因爲解答這個題目的時間只有 3 分鐘,沒有自己看題目 後來拿着程序跑了下。 p
Vite 預構建的核心原理 1. 兼容性與性能的雙重目標 Vite 的預構建旨在解決兩個主要問題:兼容性和性能。對於兼容性,由於 Vite 在開發階段將所有代碼視爲原生 ES 模塊,因此需要將 CommonJS 或 UMD 格式的依賴轉
自動裝配原理分析 條件註冊機制 spring-context模塊中有兩個組件:Condition接口和@Conditional註解,在@Conditional註解中可以指定一組Condition實現, 通常@Conditional是和@Co
@EnableXxx註解 Spring有很多@EnableXxx這種形式的註解,類似於可以一鍵打開某項功能,相當於暴露給用戶的一種便捷的配置API,例如 @EnableAsync 激活異步執行能力,@EnableTransactionMan
條件註冊 Spring 4.0 引入條件註冊機制,暴露給用戶的API是@Conditional和Condition接口,把@Conditional聲明在一個 @Component類上,並接受一組條件(Condition實現),容器初始化期間
本文分享自華爲雲社區《Python函數與模塊的精髓與高級特性》,作者:檸檬味擁抱。 Python 是一種功能強大的編程語言,擁有豐富的函數和模塊,使得開發者能夠輕鬆地構建複雜的應用程序。本文將介紹 Python 中函數和模塊的基本使用方法,
一.Vue文件內容 <template> </template> <script> </script> <style> </style>
第六屆·2024 MindSpore量子計算黑客松火熱進行中。本次大賽由量子信息網絡產業聯盟主辦,昇思MindSpore Quantum社區承辦,多所高校和單位聯合舉辦。開發者將全面體驗全新一代通用量子計算框架MindSpore Quant
作者:天彤 Atlassian 在 2020 年官方發佈公告,從 2021 年起停止 Jira Server 產品的銷售,並且在 2024 年徹底停止 Server 端產品的服務支持,這對於國內使用 Jira 產品的企業和研發團隊造成了不小
在SqlSugar開發框架的WPF應用中,有時候需要在按鈕或者其他界面元素上使用一些圖標,框架中我們可以使用 lepoco/wpfui 項目的圖標庫,也可以使用Font-Awesome-WPF 圖標庫,另外如果喜歡阿里矢量圖標庫的,也可以通
前端面試題 - NodeJS能用ES6模塊嗎?CommonJS 和 ES6模塊的區別是什麼? JS能寫前端web,也能寫NodeJS。 Node.js 後端應用由模塊組成,其模塊系統採用 CommonJS 規範,它並不是 JavaScri
Xmake 是一個基於 Lua 的輕量級跨平臺構建工具。 它非常的輕量,沒有任何依賴,因爲它內置了 Lua 運行時。 它使用 xmake.lua 維護項目構建,相比 makefile/CMakeLists.txt,配置語法更加簡潔直觀,