[愚翁专栏]如何使用Base64进行加密和解密

Base64的加密与解密 最近对网络安全的兴趣猛涨,闲着没逝,给大家整一期Base64的加密与解密。 阅读详情

其实Base64的加密和解密的算法不是很复杂,首先是定义自己64位的密钥,64个字符是固定,但是顺序是可以随自己的设计而变化。例如:

char[] BaseTable=new char[64]{

'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',

       'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',

       '0','1','2','3','4','5','6','7','8','9','+','/'};

 

接下来,在加密的时候就是对于需要加密的每个字符,通过一定的算法,转换成上面64字符的一种;而在解密的时候则是把64字符中任意一个字符反算出加密前的字符。对于每个字符的操作有很多方法,这里就不一一介绍了。需要注意的是“=”字符,在Base64加密算法中,是很重要的,它是起到补零作用。

 

以下是完整代码:

//----------------------------- Base64 class --------------------------------------

//---------------------------------------------------------------------------------

//---File:clsBase64

//---Description:The class file to encode string or decode string in base algorith

//---Author:Knight

//---Date:Oct.8, 2005

//---------------------------------------------------------------------------------

//----------------------------{ Base64 class }-------------------------------------

using System;

 

namespace Base64

{

       /// <summary>

       /// Summary description for clsBase64.

       /// </summary>

       public class clsBase64

       {

              private char[] source;

              private char[] lookupTable;

              private int length, length2, length3;

              private int blockCount;

              private int paddingCount;

 

              public clsBase64()

              {

                     //

                     // TODO: Add constructor logic here

                     //

                     source = null;

                     length = length2 = length3 =0;

                     blockCount = 0;

                     paddingCount = 0;

              }

 

              /// <summary>

              /// Create base64 char array using default base64 char array

              /// </summary>

              /// <param name="CreatePara"></param>

              /// <returns>return the new base64 char array</returns>

              private char[] CreateBase64Char( ref char[] CreatePara )

              {

                     char[] BaseTable=new char[64]{

                                                                              'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',

                                                                              'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',

                                                                              '0','1','2','3','4','5','6','7','8','9','+','/'};

                    

                     const int CREATE_TYPE = 8;

                     byte bParaValue = 0;

                     byte bTemp;

                     for( int i = 0; i < CreatePara.Length; i++ )

                     {

                            bTemp = ( byte )( CreatePara[i] );

                            switch( bTemp % CREATE_TYPE )

                            {

                                   case 1:

                                          // 00000001

                                          bTemp =( byte )( bTemp ^ 0x01 );

                                          break;

                                   case 2:

                                          // 00000010

                                          bTemp =( byte )( bTemp ^ 0x02 );

                                          break;

                                   case 3:

                                          // 00000100

                                          bTemp =( byte )( bTemp ^ 0x04 );

                                          break;

                                   case 4:

                                          // 00001000

                                          bTemp =( byte )( bTemp ^ 0x08 );

                                          break;

                                   case 5:

                                          // 00010000

                                          bTemp =( byte )( bTemp ^ 0x10 );

                                          break;

                                   case 6:

                                          // 00100000

                                          bTemp =( byte )( bTemp ^ 0x20 );

                                          break;

                                   case 7:

                                          // 01000000

                                          bTemp =( byte )( bTemp ^ 0x40 );

                                          break;

                                   default:

                                          // 10000000

                                          bTemp =( byte )( bTemp ^ 0x80 );

                                          break;

                            }

                            bParaValue =( byte )( bParaValue ^ bTemp );

                     }

                    

                     char chrTemp;

                     int nIndex;

                     switch( bParaValue % CREATE_TYPE )

                     {

                            case 1:

                                   // Exechange 0 <--> 1, 2 <--> 3, 4 <--> 5, 6 <--> 7

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 4];

                                          BaseTable[nIndex + 4] = BaseTable[nIndex + 5];

                                          BaseTable[nIndex + 5] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 6];

                                          BaseTable[nIndex + 6] = BaseTable[nIndex + 7];

                                          BaseTable[nIndex + 7] = chrTemp;

                                   }

                                   break;

                            case 2:

                                   // Exechange 0 <--> 2, 1 <--> 3, 4 <--> 6, 5 <--> 7

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 4];

                                          BaseTable[nIndex + 4] = BaseTable[nIndex + 6];

                                          BaseTable[nIndex + 6] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 5];

                                          BaseTable[nIndex + 5] = BaseTable[nIndex + 7];

                                          BaseTable[nIndex + 7] = chrTemp;

                                   }

                                   break;

                            case 3:

                                   // Exechange 0 <--> 3, 1 <--> 2, 4 <--> 7, 5 <--> 6

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 4];

                                          BaseTable[nIndex + 4] = BaseTable[nIndex + 7];

                                          BaseTable[nIndex + 7] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 5];

                                          BaseTable[nIndex + 5] = BaseTable[nIndex + 6];

                                          BaseTable[nIndex + 6] = chrTemp;

                                   }

                                   break;

                            case 4:

                                   // Mirror exechange

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + CREATE_TYPE - 1];

                                          BaseTable[nIndex + CREATE_TYPE - 1] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = BaseTable[nIndex + CREATE_TYPE - 2];

                                          BaseTable[nIndex + CREATE_TYPE - 2] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = BaseTable[nIndex + CREATE_TYPE - 3];

                                          BaseTable[nIndex + CREATE_TYPE - 3] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = BaseTable[nIndex + CREATE_TYPE - 4];

                                          BaseTable[nIndex + CREATE_TYPE - 4] = chrTemp;

                                   }

                                   break;

                            case 5:

                                   // Exechange 0 <--> 4, 1 <--> 5, 2 <--> 6, 3 <--> 7

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + 4];

                                          BaseTable[nIndex + 4] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = BaseTable[nIndex + 5];

                                          BaseTable[nIndex + 5] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = BaseTable[nIndex + 6];

                                          BaseTable[nIndex + 6] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = BaseTable[nIndex + 7];

                                          BaseTable[nIndex + 7] = chrTemp;

                                   }

                                   break;

                            case 6:

                                   // Exechange 0 <--> 5, 1 <--> 6, 2 <--> 7, 3 <--> 4

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + 5];

                                          BaseTable[nIndex + 5] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = BaseTable[nIndex + 6];

                                          BaseTable[nIndex + 6] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = BaseTable[nIndex + 7];

                                          BaseTable[nIndex + 7] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = BaseTable[nIndex + 4];

                                          BaseTable[nIndex + 4] = chrTemp;

                                   }

                                   break;

                            case 7:

                                   // Exechange 0 <--> 6, 1 <--> 7, 2 <--> 4, 3 <--> 5

                                   for( int i = 0; i < BaseTable.Length / CREATE_TYPE; i++ )

                                   {

                                          nIndex = i * CREATE_TYPE;

                                          chrTemp = BaseTable[nIndex];

                                          BaseTable[nIndex] = BaseTable[nIndex + 6];

                                          BaseTable[nIndex + 6] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 1];

                                          BaseTable[nIndex + 1] = BaseTable[nIndex + 7];

                                          BaseTable[nIndex + 7] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 2];

                                          BaseTable[nIndex + 2] = BaseTable[nIndex + 4];

                                          BaseTable[nIndex + 4] = chrTemp;

                                          chrTemp = BaseTable[nIndex + 3];

                                          BaseTable[nIndex + 3] = BaseTable[nIndex + 5];

                                          BaseTable[nIndex + 5] = chrTemp;

                                   }

                                   break;

                            default:

                                   break;

                     }

                     return BaseTable;

              }

 

              /// <summary>

              /// Encode string at specific parameter

              /// </summary>

              /// <param name=" Para "></param>

              /// <param name="input"></param>

              /// <returns>return encoded string</returns>

              public char[] GetEncoded( char[] Para , byte[] input )

              {

                     length=input.Length;

                     if((length % 3)==0)

                     {

                            paddingCount=0;

                            blockCount=length/3;

                     }

                     else

                     {

                            paddingCount=3-(length % 3);//need to add padding

                            blockCount=(length+paddingCount) / 3;

                     }

                     length2=length+paddingCount;//or blockCount *3

 

                     byte[] source2;

                     source2=new byte[length2];

                     //copy data over insert padding

                     for (int x=0; x<length2;x++)

                     {

                            if (x<length)

                            {

                                   source2[x]=input[x];

                            }

                            else

                            {

                                   source2[x]=0;

                            }

                     }

                    

                     byte b1, b2, b3;

                     byte temp, temp1, temp2, temp3, temp4;

                     byte[] buffer=new byte[blockCount*4];

                     char[] result=new char[blockCount*4];

                     for (int x=0;x<blockCount;x++)

                     {

                            b1=source2[x*3];

                            b2=source2[x*3+1];

                            b3=source2[x*3+2];

 

                            temp1=(byte)((b1 & 252)>>2);//first

 

                            temp=(byte)((b1 & 3)<<4);

                            temp2=(byte)((b2 & 240)>>4);

                            temp2+=temp; //second

 

                            temp=(byte)((b2 & 15)<<2);

                            temp3=(byte)((b3 & 192)>>6);

                            temp3+=temp; //third

 

                            temp4=(byte)(b3 & 63); //fourth

 

                            buffer[x*4]=temp1;

                            buffer[x*4+1]=temp2;

                            buffer[x*4+2]=temp3;

                            buffer[x*4+3]=temp4;

 

                     }

 

                     lookupTable = CreateBase64Char( ref Para );

                     for (int x=0; x<blockCount*4;x++)

                     {

                            result[x]=sixbit2char(buffer[x]);

                     }

 

                     //covert last "A"s to "=", based on paddingCount

                     switch (paddingCount)

                     {

                            case 0:break;

                            case 1:result[blockCount*4-1]='=';break;

                            case 2:result[blockCount*4-1]='=';

                                   result[blockCount*4-2]='=';

                                   break;

                            default:break;

                     }

                     return result;

              }

 

              private char sixbit2char(byte b)

              {

                     if((b>=0) &&(b<=63))

                     {

                            return lookupTable[(int)b];

                     }

                     else

                     {

                            //should not happen;

                            return ' ';

                     }

              }

 

              /// <summary>

              /// Decode string using specific parameter

              /// </summary>

              /// <param name=" Para "></param>

              /// <param name="input"></param>

              /// <returns>If decoded successfully, return the decoded string; else return NULL</returns>

              public byte[] GetDecoded( char[] Para , char[] input )

              {

                     int temp=0;

                     source=input;

                     length=input.Length;

 

                     if( ( length % 4 ) != 0 ) return null; // The string is not encoded with my base64;

 

                     //find how many padding there are

                     while( input[length - temp - 1] == '=' && temp < 3 )

                     {

                            temp++;

                     }

                     if( temp == 3 ) return null; // The string is not encoded with my base64;

 

                     paddingCount=temp;

                     //calculate the blockCount;

                     //assuming all whitespace and carriage returns/newline were removed.

                     blockCount=length/4;

                     length2=blockCount*3;

 

                     byte[] buffer=new byte[length];//first conversion result

                     byte[] buffer2=new byte[length2];//decoded array with padding

 

                     lookupTable = CreateBase64Char( ref Para );

                     for(int x=0;x<length;x++)

                     {

                            buffer[x]=char2sixbit(source[x]);

                     }

 

                     byte b, b1,b2,b3;

                     byte temp1, temp2, temp3, temp4;

 

                     for(int x=0;x<blockCount;x++)

                     {

                            temp1=buffer[x*4];

                            temp2=buffer[x*4+1];

                            temp3=buffer[x*4+2];

                            temp4=buffer[x*4+3];                       

 

                            b=(byte)(temp1<<2);

                            b1=(byte)((temp2 & 48)>>4);

                            b1+=b;

 

                            b=(byte)((temp2 & 15)<<4);

                            b2=(byte)((temp3 & 60)>>2);

                            b2+=b;

 

                            b=(byte)((temp3 & 3)<<6);

                            b3=temp4;

                            b3+=b;

 

                            buffer2[x*3]=b1;

                            buffer2[x*3+1]=b2;

                            buffer2[x*3+2]=b3;

                     }

                     //remove paddings

                     length3=length2-paddingCount;

                     byte[] result=new byte[length3];

 

                     for(int x=0;x<length3;x++)

                     {

                            result[x]=buffer2[x];

                     }

 

                     return result;

              }

 

              private byte char2sixbit(char c)

              {

                     if( c=='=' )

                            return 0;

                     else

                     {

                            for (int x=0;x<64;x++)

                            {

                                   if (lookupTable[x]==c)

                                          return (byte)x;

                            }

                            //should not reach here

                            return 0;

                     }

              }

 

       }

}



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=627040

密码学:一文看懂Base64算法 Base64常常在我们开发中出现,我们可能只知道它是一串乱码(看不懂的符号),知道有时候知道我们需要把一些数据进行base64编码,有时候需要进行Base64解码。但是却不知道它的作用是什么?它存在的意义是什么?还有它是如何生成的?如何编码和解码?上述的疑问相信在你读完本篇文章之后烟消云散。下面开始正文。Base64是什么?它和加密解密操作有什么关系吗?没错,这就是经过Base64编码后的字符串。对它解码后,我们获得以下内容点个关注,是对我持续创作的最大的鼓励! 阅读详情

相关推荐

golang学习笔记25——golang 实现 MD5加密、RSA加密 和 Base64编码

通过以上内容,我们详细介绍了在 Go 语言中实现 MD5 哈希、RSA 加密以及 Base64 编码的方法,并给出了相应的代码示例。这些加密和编码技术在实际开发中具有广泛的应用,开发者可以根据具体需求灵活运用。以上文章内容可以根据你的实际需求进行调整,希望对你有所帮助。

GoppViper的博客 2724

Base64加密解密

解决:btoa 不支持 Unicode 字符编码的问题编码时,先用 encodeURIComponent 对字符串进行编码,再进行 btoa 进行 Base64 编码解码时,先用 atob 对 Base64 编码的串进行解码,再用 decodeURIComponent 对字符串进行解码。注意:不适用于带中文解密,即window.btoa 与 window.atob 不支持中文,且 IE9 以下不支持atob、btoa。2、window.atob() 函数用来解码被 base64 编码过的数据。

Jin的随手笔记 3万+

C++处理AES加密(ECB/CBC + BASE64 + pkcs7padding)

最近项目需要用到aes加密,而且不打算用openssl这种大型库。网上找到Christophe Devine写的一个小型C库,就aes.h和aes.c两文件。不过没找到官方的地址和文档,只能找到好些使用这个库的项目。 这里写了个例子比较清晰展示加密的做法。

u014755159的博客 6934

BASE64加密解密(两种方式)

严格来说BASE64的加密解密是指编码格式,而非加密算法我们暂且将它归为加解密方式的一种对于Base64的使用有两种方式:第一种直接使用sun.misc包下的BASE64工具第二种是使用org.springframework包下的Base64Utils工具相较于第一种,第二种更为方便。对于Base64的使用,仅限于简单加密需求的编码解码对于安全性较高的需求尽量使用更为安全的加密解密方式。

感谢阅读 1万+

爬虫工程师必备技术栈——加密解密以及字符编码原理

爬虫工程师必备技术栈——加密解密以及字符编码原理

孤寒者的博客 57万+

〖Python零基础入门篇(56)〗- Python的加密模块 - hashlib 与 base64

今天我们来学习一下 Python 中的加密模块,加密模块在工作中被广泛应用。比如数据的传入 不希望被捕获,通过把数据加密。这样即使被捕获也无法获取到数据的真实信息,今天我们就来学习一下关于加密的方法。

易编橙 · 终身成长社群,相遇已是上上签! 4万+

使用base64加密解密的多种方法:包含pc端和微信小程序

众所周知,微信小程序的js中不能使用window对象以及document对象。 难道他们真的不存在吗?事实并非如此。

1万+

爬虫逆向:一文掌握逆向中的加密与解密(代码可直接拿来用)

在现代网络爬虫开发中,目标网站为了防止数据被轻易抓取,通常会对传输的数据进行加密处理。这些加密手段包括但不限于 Base64 编码、对称加密(如 AES)、非对称加密(如 RSA)、自定义混淆算法等。理解和破解这些加密解密算法是爬虫逆向工程中的重要环节。有些网站使用自定义的加密算法,需要通过逆向分析找到加密逻辑。案例:逆向自定义加密使用浏览器开发者工具(F12)调试 JavaScript 代码。找到加密函数,分析其逻辑。使用 Python 实现相同的逻辑。# 示例:自定义 XOR 加密。

数据知道的博客 2万+

054:vue工具 --- BASE64加密解密互相转换

vue项目中,如何做BASE64加密解密互相转换呢,下面的示例就是这样的一个小工具,具体的看源代码

大剑师兰特的GIS世界 775

前端vue CryptoJS Aes CBC加密后端java解密,如何实现?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

**My Coding Family** 1568

抓到数据包不懂怎么解密数据包?httpcanary如何解密?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1564

如何在鸿蒙中进行数据加密与解密?

数据加密技术在现代应用中扮演着至关重要的角色,尤其是在数据隐私保护、金融支付、医疗健康等领域。随着网络安全问题的日益严峻,越来越多的应用开始采纳加密技术来保障用户数据的安全。在鸿蒙系统中,开发者可以通过集成 AES、RSA 等加密算法来对数据进行保护。通过合理使用这些加密技术,并结合网络传输的加密协议(如 HTTPS、TLS),可以确保数据在传输过程中的安全性。

小白酷爱学编程,欢迎大家一块儿学习~~ 1422

Rockchip RK3566 Buildroot SDK构建与内核编译实战指南

嵌入式Linux开发中,交叉编译环境是系统启动的基础支撑。Buildroot作为轻量级嵌入式构建框架,通过配置驱动、自动化下载和分层编译机制,显著降低定制化Linux发行版的集成门槛。其核心价值在于将内核、根文件系统与工具链统一管理,兼顾资源约束下的确定性构建与工程可复现性。典型应用场景涵盖ARM64平台(如RK3566)的固件开发、IoT设备量产镜像生成及硬件Bring-up阶段的快速验证。本文围绕Buildroot SDK全流程实践,深入解析环境搭建、Repo源码同步、离线DL库预置及内核编译等关键环节

weixin_36047538的博客 134

base64加密,解密,encode,decode,编码详解+实现

以下部分内容摘自wiki百科:http://zh.wikipedia.org/wiki/Base64 概述         Base64是一种基于64(A-Z、a-z、数字0-9 ,‘+’,‘/’)个可打印字符,来表示二进制数据的表示方法,基本思想是把所有字符都转化到这64个打印字符,方便流通。         由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符

郭晓东的专栏 1万+

RAGFlow本地部署遇阻:解析进度卡顿的排查与修复指南

本文针对RAGFlow本地部署中常见的文档解析进度卡顿问题,提供了详细的排查与修复指南。核心原因是模型下载网络受阻,解决方案是通过修改环境配置文件,将模型下载源切换至国内镜像站,从而快速解决解析停滞问题。

weixin_29297127的博客 341

从波形到代码:手把手调试GaN图腾柱PFC的过零点切换与软启动策略

本文详细解析了GaN图腾柱无桥Boost PFC电路在过零点切换与软启动策略中的调试方法。通过波形分析、代码实现和寄存器配置,提供了解决误开通、震荡波形等问题的实用方案,帮助工程师优化电源设计效率与可靠性。

weixin_30831529的博客 424

Go语言中的加密和解密是如何实现的?

Go语言通过其标准库提供了丰富的加密和解密功能,使开发者能够方便地进行数据加密和解密操作。在实际应用中,开发者需要根据具体需求选择合适的加密算法和密钥,并遵循最佳实践来确保数据的安全性。同时,对于加密和解密过程的理解和掌握也是非常重要的,这有助于开发者更好地应对各种安全挑战。推荐阅读我的博客首页Golang专栏。

发现生活,分享智慧,一起成长! 869

WSL2双显卡配置实战:避开Tesla与TCC模式的那些坑

本文针对WSL2环境下无法识别Tesla计算卡的问题进行深度解析。核心原因在于WSL2目前仅支持WDDM模式的显卡,而Tesla系列及运行在TCC模式下的显卡因采用纯计算架构而无法兼容。文章提供了详细的排查步骤,并给出了包括调整显卡用途、使用虚拟机或物理机在内的多种实用解决方案,帮助开发者避开配置陷阱。

weixin_29289821的博客 538

HoRain云--PHP加密解密实战:两种经典方法详解

在Web开发中,数据加密是保护敏感信息的重要手段。本文将分享两个PHP中经典的加密解密方法,包含可直接复用的代码示例。

2401_86544677的博客 1259

数字图像处理 基于OpenCV的景深融合算法

还有的思路是对图像序列中的每一张图像分别进行拉普拉斯金字塔拆分,提取出每一张图像的高频信息和低频信息,得到所述图像序列对应的高频信息集合和低频信息集合。然后根据所述高频信息集合得到合成后的高频信息,对所述低频信息集合进行导向滤波处理得到合成后的低频信息,根据所述合成后的高频信息和低频信息做拉普拉斯金字塔重构,得到一张超景深图像。这里声明了几个变量,ImMer是最终合成的图像,coll是中间处理的变量,Coll_Ori是保存原图像数据的变量,dstWidth目标图像宽度(一般都是与原始图像大小一致)。

学以致用 知行合一 3900

Android SystemUI——车载CarSystemUI加载(八)

车载 CarSystemUI 是指专门为汽车环境设计的用户界面和用户体验(UI/UX),它通常与 Android Automotive OS 或其他嵌入式操作系统一起工作,为驾驶者和乘客提供安全、直观且高效的交互方式。Android Automotive OS 是 Google 专门为汽车开发的操作系统版本,它基于 Android 平台,并针对车辆内部的使用进行了优化。

小旭的专栏 2172

delphi php 加密解密_在PHP开发中六种加密的方法,你用的是哪种?

php 自带的加密函数 不可逆的加密函数为:md5()、crypt()md5() 用来计算 MD5 哈稀。语法为:string md5(string str);crypt() 将字符串用 UNIX 的标准加密 DES 模块加密。这是单向的加密函数,无法解密。欲比对字符串,将已加密的字符串的头二个字符放在 salt 的参数中,再比对加密后的字符串。语法为:string crypt(string st...

weixin_39603476的博客 182

AI 智能体(Agent)应用开发工程师 · 进阶面试 (五)

在有多位 Agent 共同参与决策时(如评审委员会、代码审查小组),它们可能提出截然相反的建议。共识机制就是用来在这种冲突中得出唯一行动方案的规则。常用机制:多数投票:每个 Agent 一票,根据投票结果决定。实现简单,但忽略了专业度差异。加权投票:根据 Agent 的角色重要性或历史表现赋予不同权重,例如首席架构师 Agent 的票权重是普通开发者 Agent 的 2 倍。管理者仲裁:由一个权限更高的 Manager Agent 听取各方理由后做出最终裁决。这类似于层级制组织决策。辩论收敛。

篮球界最会写bug的人;程序猿中打球最菜的人。 393

【Oracle专栏】ORA-06502:hex到raw的转换错误

ORA-06502:PL/SQL:数字或值错误:hex到raw的转换错误

weixin_42081167的博客 769

基于 Langchain 开发一个完整的支持多轮数据分析(直连 mysql 数据,多表综合分析 SQL 取数,数据分析,报表生成)ChatBI 系统(前后端完整实现源代码)

ChatBI系统开发摘要 本文介绍了基于Langchain的多轮数据分析ChatBI系统开发方案。该系统支持MySQL数据库连接,提供多表分析、SQL查询、数据分析和报表生成功能。系统采用前后端分离架构:前端使用React+Ant Design+ECharts实现交互界面;后端基于FastAPI搭建服务,集成Langchain处理自然语言到SQL的转换;核心技术栈还包括SQLAlchemy、Pandas和Matplotlib。 系统核心模块包括: 数据库连接层:使用SQLAlchemy管理MySQL连接 L

AI天才研究院 814

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java rsa加密解密_前端实现对请求参数进行RSA加密&解密,针对字符串过长进行分段加密&分段解密的处理...

前言在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密。所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位朋友问我关于jsencrypt的加密问题,记得在很早之前隐约记得整过一次这玩意,所以今天又给整理了一下,把整个的操作流程当做一篇文章给记录下来,以防急时之需!!!如何使用?使用之前,需要给项目引入jse...

weixin_39685130的博客 439

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: [愚翁专栏]如何把网络共享目录映射为本地驱动器
下一篇: [愚翁专栏]如何对系统中的某个进程进行监控
MaybeHelios
博客等级 码龄21年 65粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值