一些可逆算法汇集(一)

可逆与不可逆算法,对称加密与非对称加密算法总结 文章目录1. 加密算法的种类2. 不可逆加密算法①:MD5②:HMAC系列③:SHA系列3. 可逆加密算法1. 对称加密①:DES②:3DES③:AES2. 非对称加密①:RSA4. Base64编码5. BCrypt 1. 加密算法的种类 加密算法分为可逆、不可逆加密算法。而不可逆加密算法又分为对称加密和非对称加密 不可逆加密:不可逆加密算法最大的特点就是不需要密钥,但是HMAC是需要密钥的! 常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA- 阅读详情

COPY的资料:

微型加密算法(TEA)及其相关变种(XTEA,Block TEA,XXTEA) 都是分组加密算法,它们很容易被描述,实现也很简单(典型的几行代码)。
TEA 算法最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计的。该算法使用 128 位的密钥为 64 位的信息块进行加密,它需要进行 64 轮迭代,尽管作者认为 32 轮已经足够了。该算法使用了一个神秘常数δ作为倍数,它来源于黄金比率,以保证每一轮加密都不相同。但δ的精确值似乎并不重要,这里 TEA 把它定义为 δ=「(√5 - 1)231」(也就是程序中的 0×9E3779B9)。之后 TEA 算法被发现存在缺陷,作为回应,设计者提出了一个 TEA 的升级版本——XTEA(有时也被称为“tean”)。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。
在跟描述 XTEA 算法的同一份报告中,还介绍了另外一种被称为 Block TEA 算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。
在 1998 年,Markku-Juhani Saarinen 给出了一个可有效攻击 Block TEA 算法的代码,但之后很快 David J. Wheeler 和 Roger M. Needham 就给出了 Block TEA 算法的修订版,这个算法被称为 XXTEA。XXTEA 使用跟 Block TEA 相似的结构,但在处理块中每个字时利用了相邻字。它利用一个更复杂的 MX 函数代替了 XTEA 轮循函数,MX 使用 2 个输入量。

 

XXTEA算法在加密、解密时需要提供给算法一个自己设计的密码本,此密码本必须严密保护,不可对外泄露,可以是任意字符,甚至可以是中文。

 

C#实现:

  1. /* xxtea.cs
  2.  *
  3.  * Author:       Ma Bingyao <andot@ujn.edu.cn>
  4.  * Copyright:    CoolCode.CN
  5.  * Version:      1.1
  6.  * LastModified: 2006-05-05
  7.  * This library is free.  You can redistribute it and/or modify it.
  8.  * http://www.coolcode.cn/?p=163
  9.  */
  10. using System;
  11. class XXTEA
  12. {
  13.     public static Byte[] Encrypt(Byte[] Data, Byte[] Key)
  14.     {
  15.         if (Data.Length == 0)
  16.         {
  17.             return Data;
  18.         }
  19.         return ToByteArray(Encrypt(ToUInt32Array(Data, true), ToUInt32Array(Key, false)), false);
  20.     }
  21.     public static Byte[] Decrypt(Byte[] Data, Byte[] Key)
  22.     {
  23.         if (Data.Length == 0)
  24.         {
  25.             return Data;
  26.         }
  27.         return ToByteArray(Decrypt(ToUInt32Array(Data, false), ToUInt32Array(Key, false)), true);
  28.     }
  29.     public static UInt32[] Encrypt(UInt32[] v, UInt32[] k)
  30.     {
  31.         Int32 n = v.Length - 1;
  32.         if (n < 1)
  33.         {
  34.             return v;
  35.         }
  36.         if (k.Length < 4)
  37.         {
  38.             UInt32[] Key = new UInt32[4];
  39.             k.CopyTo(Key, 0);
  40.             k = Key;
  41.         }
  42.         UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum = 0, e;
  43.         Int32 p, q = 6 + 52 / (n + 1);
  44.         while (q-- > 0)
  45.         {
  46.             sum = unchecked(sum + delta);
  47.             e = sum >> 2 & 3;
  48.             for (p = 0; p < n; p++)
  49.             {
  50.                 y = v[p + 1];
  51.                 z = unchecked(v[p] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
  52.             }
  53.             y = v[0];
  54.             z = unchecked(v[n] += (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
  55.         }
  56.         return v;
  57.     }
  58.     public static UInt32[] Decrypt(UInt32[] v, UInt32[] k)
  59.     {
  60.         Int32 n = v.Length - 1;
  61.         if (n < 1)
  62.         {
  63.             return v;
  64.         }
  65.         if (k.Length < 4)
  66.         {
  67.             UInt32[] Key = new UInt32[4];
  68.             k.CopyTo(Key, 0);
  69.             k = Key;
  70.         }
  71.         UInt32 z = v[n], y = v[0], delta = 0x9E3779B9, sum, e;
  72.         Int32 p, q = 6 + 52 / (n + 1);
  73.         sum = unchecked((UInt32)(q * delta));
  74.         while (sum != 0)
  75.         {
  76.             e = sum >> 2 & 3;
  77.             for (p = n; p > 0; p--)
  78.             {
  79.                 z = v[p - 1];
  80.                 y = unchecked(v[p] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
  81.             }
  82.             z = v[n];
  83.             y = unchecked(v[0] -= (z >> 5 ^ y << 2) + (y >> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z));
  84.             sum = unchecked(sum - delta);
  85.         }
  86.         return v;
  87.     }
  88.     //
  89.     private static UInt32[] ToUInt32Array(Byte[] Data, Boolean IncludeLength)
  90.     {
  91.         //将加密字节根据长度进行位移运算得出&3的key
  92.         Int32 n = (((Data.Length & 3) == 0) ? (Data.Length >> 2) : ((Data.Length >> 2) + 1));
  93.         UInt32[] Result;
  94.         
  95.         if (IncludeLength)
  96.         {
  97.             Result = new UInt32[n + 1];
  98.             Result[n] = (UInt32)Data.Length;
  99.         }
  100.         else
  101.         {
  102.             Result = new UInt32[n];
  103.         }
  104.         n = Data.Length;
  105.         for (Int32 i = 0; i < n; i++)
  106.         {
  107.             Result[i >> 2] |= (UInt32)Data[i] << ((i & 3) << 3);
  108.         }
  109.         return Result;
  110.     }
  111.     private static Byte[] ToByteArray(UInt32[] Data, Boolean IncludeLength)
  112.     {
  113.         Int32 n;
  114.         if (IncludeLength)
  115.         {
  116.             n = (Int32)Data[Data.Length - 1];
  117.         }
  118.         else
  119.         {
  120.             n = Data.Length << 2;
  121.         }
  122.         Byte[] Result = new Byte[n];
  123.         for (Int32 i = 0; i < n; i++)
  124.         {
  125.             Result[i] = (Byte)(Data[i >> 2] >> ((i & 3) << 3));
  126.         }
  127.         return Result;
  128.     }
  129. }

JS实现:

  1. /* xxtea.js
  2. *
  3. * Author: Ma Bingyao <andot@ujn.edu.cn>
  4. * Copyright: CoolCode.CN
  5. * Version: 1.2
  6. * LastModified: 2006-05-02
  7. * This library is free. You can redistribute it and/or modify it.
  8. * http://www.coolcode.cn/?p=128
  9. */ 
  10. function long2str(v, w) {
  11. var vl = v.length;
  12. var sl = v[vl - 1] & 0xffffffff;
  13. for (var i = 0; i < vl; i++)
  14. {
  15. v[i] = String.fromCharCode(v[i] & 0xff,
  16. v[i] >>> 8 & 0xff,
  17. v[i] >>> 16 & 0xff, 
  18. v[i] >>> 24 & 0xff);
  19. }
  20. if (w) {
  21. return v.join('').substring(0, sl);
  22. }
  23. else {
  24. return v.join('');
  25. }
  26. }
  27. function str2long(s, w) {
  28. var len = s.length;
  29. var v = [];
  30. for (var i = 0; i < len; i += 4)
  31. {
  32. v[i >> 2] = s.charCodeAt(i)
  33. | s.charCodeAt(i + 1) << 8
  34. | s.charCodeAt(i + 2) << 16
  35. | s.charCodeAt(i + 3) << 24;
  36. }
  37. if (w) {
  38. v[v.length] = len;
  39. }
  40. return v;
  41. }
  42. function xxtea_encrypt(str, key) {
  43. if (str == "") {
  44. return "";
  45. }
  46. var v = str2long(str, true);
  47. var k = str2long(key, false);
  48. var n = v.length - 1;
  49. var z = v[n], y = v[0], delta = 0x9E3779B9;
  50. var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = 0;
  51. while (q-- > 0) {
  52. sum = sum + delta & 0xffffffff;
  53. e = sum >>> 2 & 3;
  54. for (var p = 0; p < n; p++) {
  55. y = v[p + 1];
  56. mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
  57. z = v[p] = v[p] + mx & 0xffffffff;
  58. }
  59. y = v[0];
  60. mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
  61. z = v[n] = v[n] + mx & 0xffffffff;
  62. }
  63. return long2str(v, false);
  64. }
  65. function xxtea_decrypt(str, key) {
  66. if (str == "") {
  67. return "";
  68. }
  69. var v = str2long(str, false);
  70. var k = str2long(key, false);
  71. var n = v.length - 1;
  72. var z = v[n - 1], y = v[0], delta = 0x9E3779B9;
  73. var mx, e, q = Math.floor(6 + 52 / (n + 1)), sum = q * delta & 0xffffffff;
  74. while (sum != 0) {
  75. e = sum >>> 2 & 3;
  76. for (var p = n; p > 0; p--) {
  77. z = v[p - 1];
  78. mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
  79. y = v[p] = v[p] - mx & 0xffffffff;
  80. }
  81. z = v[n];
  82. mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
  83. y = v[0] = v[0] - mx & 0xffffffff;
  84. sum = sum - delta & 0xffffffff;
  85. }
  86. return long2str(v, true);
  87. }

Java实现:

  1. /* xxtea.java 
  2. * 
  3. * Author:       Ma Bingyao < andot@ujn.edu.cn > 
  4. * Copyright:    CoolCode.CN 
  5. * Version:      1.0 
  6. * LastModified: 2006-05-11 
  7. * This library is free.  You can redistribute it and/or modify it. 
  8. * http://www.coolcode.cn/?p=169 
  9. */ 
  10. public   class xxtea { 
  11.     /** 
  12.      * Encrypt data with key. 
  13.      * 
  14.      * @param data 
  15.      * @param key 
  16.      * @return 
  17.      */ 
  18.     public   static byte [] encrypt ( byte [] data , byte [] key ) { 
  19.         if   ( data . length == 0 ) { 
  20.             return   data ; 
  21.         } 
  22.         return   toByteArray ( encrypt ( toIntArray ( data , true ) , toIntArray ( key , false )) , false ) ; 
  23.     } 
  24.   
  25.     /** 
  26.      * Decrypt data with key. 
  27.      * 
  28.      * @param data 
  29.      * @param key 
  30.      * @return 
  31.      */ 
  32.     public   static byte [] decrypt ( byte [] data , byte [] key ) { 
  33.         if   ( data . length == 0 ) { 
  34.             return   data ; 
  35.         } 
  36.         return   toByteArray ( decrypt ( toIntArray ( data , false ) , toIntArray ( key , false )) , true ) ; 
  37.     } 
  38.   
  39.     /** 
  40.      * Encrypt data with key. 
  41.      * 
  42.      * @param v 
  43.      * @param k 
  44.      * @return 
  45.      */ 
  46.     public   static int [] encrypt ( int [] v , int [] k ) { 
  47.         int   n = v . length - 1 ; 
  48.         if   ( n < 1 ) { 
  49.             return   v ; 
  50.         } 
  51.         if   ( k . length < 4 ) { 
  52.             int []   key = new int [ 4 ] ; 
  53.             System . arraycopy ( k , 0 , key , 0 , k . length ) ; 
  54.             k = key ; 
  55.         } 
  56.         int   z = v [ n ] , y = v [ 0 ] , delta = 0x9E3779B9 , sum = 0 , e ; 
  57.         int   p , q = 6 + 52 / ( n + 1 ) ; 
  58.         while   ( q -- > 0 ) { 
  59.             sum = sum + delta ; 
  60.             e = sum >>> 2 & 3 ; 
  61.             for   ( p = 0 ; p < n ; p ++ ) { 
  62.                 y = v [ p + 1 ] ; 
  63.                 z = v [ p ] += ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ; 
  64.             } 
  65.             y = v [ 0 ] ; 
  66.             z = v [ n ] += ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ; 
  67.         } 
  68.         return   v ; 
  69.     } 
  70.   
  71.     /** 
  72.      * Decrypt data with key. 
  73.      * 
  74.      * @param v 
  75.      * @param k 
  76.      * @return 
  77.      */ 
  78.     public   static int [] decrypt ( int [] v , int [] k ) { 
  79.         int   n = v . length - 1 ; 
  80.         if   ( n < 1 ) { 
  81.             return   v ; 
  82.         } 
  83.         if   ( k . length < 4 ) { 
  84.             int []   key = new int [ 4 ] ; 
  85.             System . arraycopy ( k , 0 , key , 0 , k . length ) ; 
  86.             k = key ; 
  87.         } 
  88.         int   z = v [ n ] , y = v [ 0 ] , delta = 0x9E3779B9 , sum , e ; 
  89.         int   p , q = 6 + 52 / ( n + 1 ) ; 
  90.         sum = q * delta ; 
  91.         while   ( sum != 0 ) { 
  92.             e = sum >>> 2 & 3 ; 
  93.             for   ( p = n ; p > 0 ; p -- ) { 
  94.                 z = v [ p - 1 ] ; 
  95.                 y = v [ p ] -= ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ; 
  96.             } 
  97.             z = v [ n ] ; 
  98.             y = v [ 0 ] -= ( z >>> 5 ^ y << 2 ) + ( y >>> 3 ^ z << 4 ) ^ ( sum ^ y ) + ( k [ p & 3 ^ e ] ^ z ) ; 
  99.             sum = sum - delta ; 
  100.         } 
  101.         return   v ; 
  102.     } 
  103.   
  104.     /** 
  105.      * Convert byte array to int array. 
  106.      * 
  107.      * @param data 
  108.      * @param includeLength 
  109.      * @return 
  110.      */ 
  111.     private   static int [] toIntArray ( byte [] data , boolean includeLength ) { 
  112.         int   n = ((( data . length & 3 ) == 0 ) ? ( data . length >>> 2 ) 
  113.                 : (( data . length >>> 2 ) + 1 )) ; 
  114.         int []   result ; 
  115.         if   ( includeLength ) { 
  116.             result = new   int [ n + 1 ] ; 
  117.             result [ n ] = data . length ; 
  118.         }   else { 
  119.             result = new   int [ n ] ; 
  120.         } 
  121.         n = data . length ; 
  122.         for   ( int i = 0 ; i < n ; i ++ ) { 
  123.             result [ i >>> 2 ] |= ( 0x000000ff & data [ i ]) << (( i & 3 ) << 3 ) ; 
  124.         } 
  125.         return   result ; 
  126.     } 
  127.   
  128.     /** 
  129.      * Convert int array to byte array. 
  130.      * 
  131.      * @param data 
  132.      * @param includeLength 
  133.      * @return 
  134.      */ 
  135.     private   static byte [] toByteArray ( int [] data , boolean includeLength ) { 
  136.         int   n ; 
  137.         if   ( includeLength ) { 
  138.             n = data [ data . length - 1 ] ; 
  139.         }   else { 
  140.             n = data . length << 2 ; 
  141.         } 
  142.   
  143.         byte []   result = new byte [ n ] ; 
  144.         for   ( int i = 0 ; i < n ; i ++ ) { 
  145.             result [ i ] = ( byte )   ( data [ i >>> 2 ] >>> (( i & 3 ) << 3 )) ; 
  146.         } 
  147.         return   result ; 
  148.     } 
  149. }

AS3实现:

 package com.klstudio.crypto{
       
        import com.klstudio.util.StringUtil;
       
        public class XXTEA{
               
                public function XXTEA(){
                        throw new Error("XXTEA class is static container only");
                }
               
                private static function long2str(v:Array,w:Boolean):String {
                        var vl:uint = v.length;
                        var sl = v[vl - 1] & 0xffffffff;
                        for (var i:uint = 0; i < vl; i++){
                                v[i] = String.fromCharCode(v[i] & 0xff,
                                                           v[i] >>> 8 & 0xff,
                                v[i] >>> 16 & 0xff,
                                v[i] >>> 24 & 0xff);
                        }
                        if(w){
                                return v.join('').substring(0, sl);
                        }
                        else {
                                return v.join('');
                        }
                }
               
                private static function str2long(s:String,w:Boolean):Array {
                        var len:uint = s.length;
                        var v:Array = new Array();
                        for (var i:uint = 0; i < len; i += 4){
                                v[i >> 2] = s.charCodeAt(i)
                                | s.charCodeAt(i + 1) << 8
                                | s.charCodeAt(i + 2) << 16
                                | s.charCodeAt(i + 3) << 24;
                        }
                        if (w) {
                                v[v.length] = len;
                        }
                        return v;
                }
               
                public static function encrypt(char:String,key:String):String{
                        if(char == ""){
                                return "";
                        }
                        var v:Array = str2long(StringUtil.utf16to8(char), true);
                        var k:Array = str2long(key, false);
                        var n:uint = v.length - 1;
                       
                        var z:Number = v[n];
                        var y:Number = v[0];
                        var delta:Number = 0x9E3779B9;
                        var mx:Number;
                        var q:Number = Math.floor(6 + 52 / (n + 1))
                        var sum:Number = 0;
                        while (q-- > 0) {
                                sum = sum + delta & 0xffffffff;
                                var e:Number = sum >>> 2 & 3;
                                for (var p:uint = 0; p < n; p++) {
                                        y = v[p + 1];
                                        mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                                        z = v[p] = v[p] + mx & 0xffffffff;
                                }
                                y = v[0];
                                mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                                z = v[n] = v[n] + mx & 0xffffffff;
                        }
                        return long2str(v, false);
                }
               
                public static function decrypt(char:String,key:String):String{
                        if (char == "") {
                                return "";
                        }
                        var v:Array = str2long(char, false);
                        var k:Array = str2long(key, false);
                        var n:uint = v.length - 1;
                       
                        var z:Number = v[n - 1];
                        var y:Number = v[0];
                        var delta:Number = 0x9E3779B9;
                        var mx:Number;
                        var q:Number = Math.floor(6 + 52 / (n + 1));
                        var sum:Number = q * delta & 0xffffffff;
                        while (sum != 0) {
                                var e:Number = sum >>> 2 & 3;
                                for (var p:uint = n; p > 0; p--) {
                                        z = v[p - 1];
                                        mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                                        y = v[p] = v[p] - mx & 0xffffffff;
                                }
                                z = v[n];
                                mx = (z >>> 5 ^ y << 2) + (y >>> 3 ^ z << 4) ^ (sum ^ y) + (k[p & 3 ^ e] ^ z);
                                y = v[0] = v[0] - mx & 0xffffffff;
                                sum = sum - delta & 0xffffffff;
                        }
                       
                        return StringUtil.utf8to16(long2str(v, true));
                }
        }
}

 

 

以C#实现为例,调用加解密类操作时:

1)加密:

  1. .........
  2. //欲加密字符串
  3. String str = "我要加密";
  4. //密码本
  5. String encryptionStr = "你真的要加密吗?";
  6. //得到encoder对象
  7. System.Text.Encoding encoder = System.Text.Encoding.UTF8;
  8. //使用XXTEA加密类对输入字符串进行加密,得到加密后的字节数组(字节数组,字节数组)
  9. Byte[] data = XXTEA.Encrypt(encoder.GetBytes(str), encoder.GetBytes(encryptionStr;
  10. //将加密后的字节数组转换为等效字符串
  11. String decryptStr = System.Convert.ToBase64String(data);
  12. .........

2)解密:

  1. .........
  2. //得到encoder对象
  3.             System.Text.Encoding encoder = System.Text.Encoding.UTF8;
  4.             //欲解密字符串 
  5.             String decryptStr = "这里是加密得到的decryptStr字符串";
  6.             //密码本 
  7.             String encryptionStr = "你真的要加密吗?";
  8.             //解密后的字符串
  9.             String str = "";
  10.             try
  11.             {
  12.                 //通过XXTEA解密类将加密字符串解密
  13.                 str = encoder.GetString(XXTEA.Decrypt(System.Convert.FromBase64String(decryptStr), encoder.GetBytes(encryptionStr)));
  14.             }
  15.             catch (Exception e)
  16.             {
  17.                throw new Exception("这个字符不可解密!");
  18.             }
  19. .........

 

ACM国家队核心算法与实战论文全解析 htmltable {th, td {th {pre {简介:《ACM国家队论文》汇集了历年ACM国际大学生程序设计竞赛国家队的研究成果与实战经验,是提升算法设计与编程能力的重要学习资料。内容涵盖高级算法、经典与高级数据结构、编程语言效率优化、竞赛策略、团队协作及真实案例解析,全面助力读者掌握解决复杂计算问题的核心技能。本论文集不仅适合竞赛选手精进技术,也为广大编程爱好者提供了系统化学习路径和持续提升的资源指引。 阅读详情

相关推荐

多种压缩算法源码实现与解析

在真实应用场景中,不同数据类型的统计特性显著影响各类无损压缩算法的效率。为科学评估主流算法的适用边界,我们选取五类典型数据集进行系统性压测,涵盖文本、源码、日志、XML文档、图像元数据、音频PCM流、ELF可执行文件等,使用gzip(DEFLATE)、bzip2(BWT+MTF+RLE+算术编码)、xz(LZMA)和zstd(有限状态熵+FSE)四种广泛部署的工具,在统一硬件平台(Intel i7-12700K, 32GB DDR4, Ubuntu 22.04 LTS)上运行。

weixin_35871529的博客 1071

加密算法概念分类,以及使用通俗的例子说明什么是可逆算法,不可逆算法,对称加密算法,非对称加密算法

这里就不引用百科长长的概念解释了,通俗的说可逆即是可以将密文再次转为明文即为可逆。这里同样不引用百科长长的概念解释了,通俗的说可逆即是不可以将密文再次转为明文即为可逆。引用360百科解释引用360百科解释看完以上概念,应该对这四中分类有一定的了解,那么实际上呢,四种分类评判的维度不完全一致,而细心的小伙伴则会发现,实际上可逆加密是包含非对称加密和对称加密的,为什么这样说呢,因为对称和非对称,实际上都是为了保证数据的安全传输,本质是需要传输后解析,获取回原来的数据的,所以先决条件就是必须可逆。1.不可逆算法,

xtho62的博客 2983

Delphi数值算法实战:常用数值计算源码精讲

矩阵是一个按照行列排列的矩形数组,通常用大写字母表示,如 $ A \in \mathbb{R}^{m \times n} $ 表示一个具有 $ m $ 行 $ n $ 列的实数矩阵。每个元素 $ a_{ij} $ 对应第 $ i $ 行第 $ j $ 列的位置值。矩阵不仅仅是一种存储数据的方式,它本质上代表了一个线性变换:将一个向量空间中的向量映射到另一个向量空间。

weixin_26854475的博客 357

php可逆加密算法有哪些,可逆加密算法

不可逆信息摘要算法(也称Hash算法)主要有:MD5,SHA系列,HMAC系列。可逆加密算法分 对称式 和 非对称式,对称式:DES,3DES,AES系列非对称式:RSA,ECC椭圆曲线加密相关算法基础可逆加密算法简单的对称可逆加密算法原理,我们可以把它理解为一道数学题:假设A有一个数字 88,接下来A想对它加密,拿一个密钥数7来加密,比如把它相加得到密文 88+7=95A把加密后的95传输给B,...

weixin_34596480的博客 1423

基于HVS感知模型与数据压缩的可逆图像水印算法

提出了一种基于人类视觉系统(HVS)感知模型和数据压缩技术可逆图像水印算法。算法首先将原始图像进行分块,每块进行DCT变换,利用JND模型对变换域系数进行处理,得到每个像素最大可提取的有效位并提取。

基于差分的可逆水印算法源程序

一个基于差分的可逆水印算法的源程序。算法采用matlab实现。

密码加密方式

SpringSecurity提供了实现PasswordEncoder接口的密码加密工具类:BcryptPasswordEncoder,该类基于Bcrypt强哈希算法来加密密码,更加安全;Bcrypt强哈希方法每次加密相同的明文得到的密文结果都不一样,这样即使数据库泄露,黑客也很难破解密码;1)Bcrypt加密一般在注册用户时,Bcrypt使用SHA-256加密算法+随机盐值+秘钥(明文密码)进行加密处理,得到的密文存入数据库中;@Test} else {生成加密的代码。

m0_62943934的博客 3863

基于差分的可逆水印

基于差分的可逆水印的matlab实现,此为程序的文档,复制到matlab中可以实现。

JAVA AES/DES 对称可逆加密算法简单入门

AES,DES 都是分组加密,对明文进行加密处理时并不是把整个明文直接一股脑加密得到密文,而是分为分为多少个字节为一组,对每一组明文进行单独加密,最后拼合加密结果。采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。(简单理解加密解密使用的是同一把密钥)默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding。数据块的大小为8位, 不够就补足。常用工作模式有 ECB、CBC。

m0_69914962的博客 1196

告别龟速与断连:Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南

本文提供Arduino IDE下ESP32及ESP32-CAM一站式环境部署指南,解决下载速度慢、断连等常见问题。通过国内镜像源加速、详细步骤讲解和ESP32-CAM专属配置技巧,帮助开发者快速完成环境搭建,避免常见陷阱,提升开发效率。

weixin_30576827的博客 771

VBA常见错误 - “错误3706,未找到提供程序,该程序可能未正确安装”解决方法

1、问题描述 在利用VBA编程时,引用其它表格数据,出现以下问题: (1)运行“错误3706,未找到提供程序,该程序可能未正确安装”。 (2)引用数据失败 2、解决方法 下载“Access 2010 数据库引擎”,并安装即可。 https://www.microsoft.com/en-us/download/details.aspx?id=54920 AccessDatabaseEngine 2010 官方安装包,官网下载不了的可以来这里下载。(1)运行“错误3706,未找到提..

Nemuel的博客 3万+

C#加密解密方法匯集

http://blog.youkuaiyun.com/majiabao123/article/details/4054654 1、方法一 (不可逆加密) public string EncryptPassword(string PasswordString,string PasswordFormat ) { string encryptPassword = null; if (Pas

I am Rocky 894

程序员的自我修养

一个好的程序员的自我修养需要从不同角度出发,工作能力是一个方面,对自身的定位和了解也是一个方面,程序员的工作能力修养包括需求理解、功能设计、沟通确认、代码规范、成果验证、代码重构优化等,通过自我剖析来对自身进行定位并了解自身的优缺点,如去除劣根性、端正意识形态与态度、提升自己的核心竞争力等。 自我剖析 一个成功的人,必须要先了解自己,只有了解自己是什么样的人,了解自身有哪些优缺点,了解自己更合适做什么工作,知道自己做什么才能发挥出自身的优势,这样才能使自己在工作中发光发热,在职业生涯的道路上走的更远。

数通畅联 1673

C#加密解密方法汇集

 1、方法一 (不可逆加密)  public string EncryptPassword(string PasswordString,string PasswordFormat )    ...{    string  encryptPassword = null;   if (PasswordFormat="SHA1")...{    encryptPassword=For

alice_art的专栏 1072

在Cursor中集成Ollama与Qwen2.5‑Coder:零成本本地AI开发环境搭建

本文详细介绍了如何零成本搭建本地AI开发环境,通过将Cursor IDE与本地运行的Ollama及Qwen2.5-Coder模型集成,实现数据不出本地的智能编程辅助。教程涵盖Ollama安装、模型拉取、ngrok内网穿透配置及Cursor设置等核心步骤,并提供了实战测试与常见问题排错指南,为注重隐私与成本的开发者提供安全高效的解决方案。

weixin_29296241的博客 1071

AArch64 ARM64 寄存器介绍

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。

lml435035844的博客 1万+

Java:加密算法(更新中)

基于java实现的加密算法,如md5加密(虽然目前只整理了md5加密)

经年藏殊的博客 151

手把手教你学Simulink--单相逆变器模糊逻辑控制策略仿真

本文介绍了在Simulink中设计单相逆变器模糊逻辑控制策略的完整流程。主要包括:1)构建单相逆变器模型;2)使用FuzzyLogicToolbox设计模糊控制器,定义输入输出变量和模糊规则;3)将控制器集成到Simulink模型;4)添加干扰源和示波器;5)配置仿真参数并分析结果。该方法利用模糊控制处理非线性系统的优势,可实现输出电压的精确跟踪,具有良好的鲁棒性。文中提供了详细的步骤说明和示例代码,强调准确设计隶属函数和规则库对控制性能的关键作用。该仿真设计为电力电子控制系统的开发提供了有效支持。

MHD0815的博客 200

程序是怎样跑起来的 第六章

讲文件的压缩机制。先了解一下保存在文件中的数据形式,文件是将数据存储在磁盘等存储媒介中的一种形式。说白了就是字节数据的集合。如果数据是文字,这个文件就是文本文件,是图形就是图像文件,但是文件的字节数据都是连续存储的。现在看一下压缩机制,第一种是 RLE算法。就是将文件的内容用“字符*重复次数”的形式压缩。比如“aaaaaabbcddeeeeef”这个数据,它就可以用“a6b2c1d2e5f1”来表...

weixin_34273046的博客 107

SAP 标准 CDS View 到底能不能用 CDS Extension View 扩展,我们在项目里应该这样判断

文章摘要:判断SAP标准CDS视图(如A_PRODUCT)能否扩展字段,不能仅凭命名或@Metadata.allowExtensions判断,需检查DDL源码中的@AbapCatalog.viewEnhancementCategory值。#PROJECTION_LIST允许扩展字段,#NONE则禁止。聚合视图需额外包含#GROUP_BY,UNION视图需#UNION。CDS View Extension用于新增字段,Metadata Extension仅用于添加注解。在ABAP Cloud环境中还需检查AP

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 98

Python爬虫实战:利用最新技术高效爬取百度贴吧帖子内容

本文将详细介绍如何使用Python最新技术栈构建一个高效的百度贴吧爬虫,包括requests-html异步请求、BeautifulSoup4解析、数据存储到MongoDB以及应对反爬机制等完整解决方案。文章包含5000余字详细教程和完整代码实现。网络爬虫(Web Crawler)是一种自动获取网页内容的程序,广泛应用于搜索引擎、数据分析和内容聚合等领域。Python凭借其丰富的库生态系统成为爬虫开发的首选语言。贴吧作为中文互联网最大的兴趣社区,包含大量有价值的UGC内容。动态加载内容处理登录状态维持。

2201_76125261的博客 540

【船长】区块链主流共识算法

一.POW(Proof Of Work) Proof Of Work,也就是工作量证明。工作量证明系统(或者说协议、函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。这种系统要求得到证明的过程是低效且漫长的,可是校验则是高效且迅速,概括起来就是求解难,验证容易。 比特币是第一个区块链应用,同时也是最著名的应用之一,它所使用的共...

圆方圆学院的博客 4486

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

区块链主流共识算法

一.POW(Proof Of Work) Proof Of Work,也就是工作量证明。工作量证明系统(或者说协议、函数),是一种应对拒绝服务攻击和其他服务滥用的经济对策。它要求发起者进行一定量的运算,也就意味着需要消耗计算机一定的时间。这种系统要求得到证明的过程是低效且漫长的,可是校验则是高...

chuaiweiyi7611的博客 660

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

TCN(Temporal Convolutional Network,时间卷积网络)

1 前言 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别、机器翻译、手写体识别、序列数据分析(预测)等。 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一次只能处理一个时间步长,后一步必须等前一步处理完才能进行运算。这意味着 RNN 不能像 CNN 那样进行大规模并行处理,特别是在 RNN/LSTM 对文本进行双向处理时。这也意味着 RNN 极度地计算密集,因为在整个任务运行完成之前,必须保存所有的中间结果。 ...

weixin_39910711的博客 12万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 老兄,快来一起过春天!(五)
下一篇: 老兄,快来一起过春天!(六)
Begin_Game
博客等级 码龄18年 239粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值