永发信息网

如何使用Base64进行加密和解密

答案:2  悬赏:40  手机版
解决时间 2021-02-28 13:08
如何使用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 description for clsBase64.
///

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;
}

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

///
/// return the new base64 char array
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];
}
//remove paddings
length3=length2-paddingCount;
byte[] result=new byte[length3];

for(int x=0;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;
}
}

}
}
全部回答
这里有详细的代码解释保存c元,java,php,javascript
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
世界上最慢的是什么东西
如图是隋朝重大历史事件的时间轴,图中的②代
澳大利亚有几个区域?是三个吗?
一般初夜过后有什么身理反应
鑫日印刷物资地址有知道的么?有点事想过去
大学毕业后户口,档案在哪里 能怎么处理
男孩一般都喜欢和开朗的女孩玩,但更喜欢找个
每天咸宁到钟祥的火车都是几点的?
自动挡上大坡用+还是用-挡
汽车贷款要什么条件,汽车服务类创业项目可以
苏j一ju115车主号码移车
西买回民活鸡店怎么去啊,有知道地址的么
戴望舒的雨巷的中心主旨
支付宝里面的娱乐宝投资的可以提前取出来吗?
北京的les club多吗,在哪里有
推荐资讯
【悲壮】悲壮是什么意思
铠甲勇士捕将大电影立刻播放
感谢!感恩的句子
傲视三国中如何任命科技官员
排位掉线了扣分多少,是和失败扣一样分么
e部落网咖网通NO.12地址有知道的么?有点事想
上海人喜欢吃什么?
所有手机都能用天翼视讯么?
盛大教育地址在哪,我要去那里办事
企业发行公司债券的利息费用可能计入的会汁科
东沟里我想知道这个在什么地方
吉祥如意水饺后墙路店这个地址在什么地方,我
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?