嗨我有数据和密钥(两个字符串)。需要使用Base64使用密钥对数据进行编码。有人可以给我一个示例代码。
答案 0 :(得分:4)
Base64不适用于'使用密钥进行编码'。它只是一种编码方案:您可以使用Base64加密和解密字符串而无需任何额外的。它仅用于非常(非常)基本的安全用法。
答案 1 :(得分:1)
您可以使用密钥对数据进行xor,然后对其进行base64编码。
var key = "mykey";
var mydata = "some long text here";
var output = '';
for (var i = 0, len = mydata.length; i < len; i++) {
output += String.fromCharCode(mydata.charCodeAt(i) ^ key.charCodeAt(i % key.length));
}
然后使用某个地方的某个函数将'output'编码为base64
答案 2 :(得分:1)
如果您需要使用密钥对Base64进行编码,那么实际上并不难做到这一点,即使它没有在标准中定义。
Base64使用64个符号的字母表。前62个符号是英文字母的小写和大写字母,加上0到9的数字。最后2个字符最常见的是+和/,但这些可能在实现之间有所不同。
现在明白了,当你将字符串分成比特,并使用6比特而不是每符号8重新组合它们时,你总是可以在字母表中查找符号,因为6位数字恰好有64个不同可能的价值观Base64只列举%000000(0)到111111(63)的符号。但您可以在此符号查找期间使用密钥。假设您的6位数字是%000011(3),因此它将索引字母表中的第4个符号。但现在您可以使用您的密钥修改该索引,向左或向右移动(例如)等于密钥字符的ASCII码(8位数)的位置数。每当你的指数超出范围(低于0或高于63)时,你只需将它传送到范围的另一侧。如果在编码期间右移索引,则使用左方向进行解码(反之亦然)。基本上,您正在用符号字符定义的模式来加扰符号查找。
在那里,您只需使用带有密钥的Base64编码(而不是先键入输入然后编码)。你很受欢迎。
既然你要求代码示例,下面是Object Pascal的快速示例,我写的。如果您首先为最终字符串分配内存然后写入它,而不是连接到循环中的字符串,每次重新分配内存,这个代码可能会更快 - 但如果您需要,您可以自己弄明白为了更好的表现:
const
C_ALPHABIG = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
C_ALPHASMALL = 'abcdefghijklmnopqrstuvwxyz';
C_ALPHA = C_ALPHABIG+C_ALPHASMALL;
C_DIGITS = '0123456789';
C_SYMBOLS = '+/';
C_ALPHABET = C_ALPHA+C_DIGITS+C_SYMBOLS;
type
TIndexShiftDirection = (isdLeft, isdRight);
Function ShiftSymbolIndex(const AIndex: integer; const AKey: string; var ACurrentKeyPos: integer; const ADirection: TIndexShiftDirection): integer;
begin
Result := AIndex; if(AKey='')then exit;
if(ACurrentKeyPosLength(AKey))then ACurrentKeyPos := 1;
if(ADirection=isdRight)
then begin
Result := Result+Ord(AKey[ACurrentKeyPos]);
if(Result>64)then Result := Result mod 64;
if(Result=0)then Result :=64;
end
else begin
Result := Result-Ord(AKey[ACurrentKeyPos]);
if(Result=Length(AKey))
then ACurrentKeyPos := 1
else inc(ACurrentKeyPos);
end;
Function Encode64(const s: string; const Key: string): string;
var
i,n,p,k : integer;
a,b,c,d : byte;
begin
Result := ''; k := 1; if(s='')then exit;
n := Length(s)div 3;
if(n>0)then for i:=0 to n-1 do
begin
p := (i*3)+1;
a := (ord(s[p])shr 2); inc(a);
b := ((ord(s[p])and %00000011)shl 4)+(ord(s[p+1])shr 4); inc(b);
c := ((ord(s[p+1])and %00001111)shl 2)+(ord(s[p+2])shr 6); inc(c);
d := ord(s[p+2])and %00111111; inc(d);
//
a := ShiftSymbolIndex(a,key,k, isdRight);
b := ShiftSymbolIndex(b,key,k, isdRight);
c := ShiftSymbolIndex(c,key,k, isdRight);
d := ShiftSymbolIndex(d,key,k, isdRight);
//
Result := Result
+ C_ALPHABET[a]
+ C_ALPHABET[b]
+ C_ALPHABET[c]
+ C_ALPHABET[d];
end;
n := Length(s)-(n*3);
if(n=0)then begin {Result := Result+'0';} exit; end;
case n of
1: begin
p := Length(s);
a := (ord(s[p])shr 2); inc(a); a := ShiftSymbolIndex(a,key,k, isdRight);
b := (ord(s[p])and %00000011); inc(b); b := ShiftSymbolIndex(b,key,k, isdRight);
Result := Result
+ C_ALPHABET[a]
+ C_ALPHABET[b]
{+ '2'};//if Length(endoced_str)mod 4 = 2, then this case is true
end;
2: begin
p := Length(s)-1;
a := (ord(s[p])shr 2);
b := ((ord(s[p])and %00000011)shl 4)+(ord(s[p+1])shr 4);
c := (ord(s[p+1])and %00001111);
inc(a); a := ShiftSymbolIndex(a,key,k, isdRight);
inc(b); b := ShiftSymbolIndex(b,key,k, isdRight);
inc(c); c := ShiftSymbolIndex(c,key,k, isdRight);
Result := Result
+ C_ALPHABET[a]
+ C_ALPHABET[b]
+ C_ALPHABET[c]
{+ '4'};//if Length(endoced_str)mod 4 = 3, then this case is true
end;
end;
end;
Function Decode64(const s: string; const Key: string): string;
var
n,i,p,k : integer;
a,b,c,d : byte;
begin
Result := ''; k:=1; if(s='')then exit;
n := Length(s)div 4;
if(n>0)then for i:=0 to n-1 do
begin
p := (i*4)+1;
a := Pos(s[p],C_ALPHABET); a := ShiftSymbolIndex(a,key,k, isdLeft);
b := Pos(s[p+1],C_ALPHABET); b := ShiftSymbolIndex(b,key,k, isdLeft);
c := Pos(s[p+2],C_ALPHABET); c := ShiftSymbolIndex(c,key,k, isdLeft);
d := Pos(s[p+3],C_ALPHABET); d := ShiftSymbolIndex(d,key,k, isdLeft);
if(a*b*c*d=0)then begin Result := ''; exit; end; //cannot be, if symbols are valid
Result := Result
+ chr(((a-1)shl 2) + ((b-1)shr 4))
+ chr((((b-1)and %001111)shl 4) + ((c-1)shr 2))
+ chr((((c-1)and %000011)shl 6) + (d-1));
end;
n := Length(s)mod 4;
if(n=0)then exit;
case n of
2: begin
p := Length(s)-1;
a := Pos(s[p],C_ALPHABET); a := ShiftSymbolIndex(a,key,k, isdLeft);
b := Pos(s[p+1],C_ALPHABET); b := ShiftSymbolIndex(b,key,k, isdLeft);
if(a*b=0)then begin Result := ''; exit; end; //cannot be, if symbols are valid
Result := Result
+ chr(((a-1)shl 2) + (b-1));
end;
3: begin
p := Length(s)-2;
a := Pos(s[p],C_ALPHABET);
b := Pos(s[p+1],C_ALPHABET);
c := Pos(s[p+2],C_ALPHABET);
if(a*b*c=0)
then begin Result := ''; exit; end; //cannot be, if symbols are valid
a := ShiftSymbolIndex(a,key,k, isdLeft);
b := ShiftSymbolIndex(b,key,k, isdLeft);
c := ShiftSymbolIndex(c,key,k, isdLeft);
Result := Result
+ chr(((a-1)shl 2) + ((b-1)shr 4))
+ chr((((b-1)and %001111)shl 4) + (c-1));
end;
else Result := '';
end;
end;
注意函数 ShiftSymbolIndex - 这是符号查找加扰器,它可以向右或向左移动符号索引。我在编码器中使用,并留在编码器中,但这完全取决于你。 如果您跳过 Encode64 或 Decode64 功能中的键参数(或者如果您传递空字符串键),那么您将最终使用默认的Base64编码/解码。
此外,此编码器不会将填充(&#34; =&#34;字符)附加到base64编码的字符串。解码时不需要填充,除非您的解码器以严格模式工作(此编码器不是) - 但是,您可以自己弄清楚。
答案 3 :(得分:0)
您可以使用apache commons Codec库的Base64
类。这是homepage和download page。
答案 4 :(得分:0)
您可以使用对称二进制加密算法,例如Twofish或RC4,它使用这样的密钥,然后将结果编码为base-64。
答案 5 :(得分:0)
Base64不包含使用密钥加密的功能。您可以先使用AES,DES等加密,然后使用base64进行编码。
答案 6 :(得分:0)
Base64 是纯粹的编码;您不能使用 base64 进行加密或解密,因为根据定义加密是使用密钥进行编码,并且由于您不能使用带有 base64 的密钥,因此它不能是任何类型的加密。
Base64 是编码,用于将数据转换为任何人都可以反转的新类型。你会听到人们告诉你这是为了混淆等,它不是;这不是编码的目的。
所以直接针对您的问题,base64 不能接受密钥;它只能编码,而编码不使用密钥。有一些加密机制,比如 XOR 是最简单的,可以接受密钥并加密。
编码 + 密钥 = 加密 编码 = 将数据转换为任何人都可以逆转的另一种类型,永远不使用密钥 散列 = 数据的单向数学函数以“指纹”您的数据。不可逆转,用于验证数据没有改变。
这种混淆的根源是我们使用“编码”这个词来表示特定的事情,而不是加密,我们还使用“编码”作为加密必须进行的过程。用同一个词来解释两个相关但不同的事物会造成很多混淆。