Base64编码

; BASE64编码是邮件加密协议的必用算法,实际上就是一个简单的字节置换

; 首先是将原字符串按6 bits 分组,高2位加0作为一个字节然后查找如下的

; 码表获得加密字符.原文字符若不为3的倍数,用0补足参与运算,最后要把全

; 0字节置换为"=",具体算法如下代码所示:

; 可以采用查表法处理,但同样的问题是,那不适我喜欢的方式,让我聪明的程序

; 来干这玩意吧.

; 码表如下:
; Value Encoding Value Encoding Value Encoding Value Encoding
; 0 A 17 R 34 i 51 z
; 1 B 18 S 35 j 52 0
; 2 C 19 T 36 k 53 1
; 3 D 20 U 37 l 54 2
; 4 E 21 V 38 m 55 3
; 5 F 22 W 39 n 56 4
; 6 G 23 X 40 o 57 5
; 7 H 24 Y 41 p 58 6
; 8 I 25 Z 42 q 59 7
; 9 J 26 a 43 r 60 8
; 10 K 27 b 44 s 61 9
; 11 L 28 c 45 t 62 +
; 12 M 29 d 46 u 63 /
; 13 N 30 e 47 v
; 14 O 31 f 48 w (pad) =
; 15 P 32 g 49 x
; 16 Q 33 h 50 y
include '%fasinc%/win32as.inc'
.data
en_1 db "Sun Bird!!!"
en1.size=$-en_1
fmt db "ENC length=%d DECode length=%d",0
buf2 rb 256
buf3 rb 256
buf rb 256
zTit db "By Hume 2K2",0
.code
StArT:
mov esi,en_1
mov edi,buf
mov ecx,en1.size
call base64_enc
invokeMessageBox,0,buf,zTit,0
mov edi,buf
call my_strlen
mov esi,buf
mov edi,buf3
call base64_dec
invokeMessageBox,0,buf3,zTit,0
invokewsprintf,buf2,fmt,enc.size,b64.dcode.size
invokeMessageBox,0,buf2,zTit,0
invokeExitProcess,0
my_strlen: ;edi->stringz ecx and eax and edi altered...
xor eax,eax
or ecx,-1
repnz scasb
neg ecx
dec ecx
dec ecx
ret
;IN : esi=src_begin ecx=len>0
;OUT: edi=buf contains encoded strings
;pure code lines=55 size=112 bytes
base64_enc:
xor eax,eax
gen_base64:
xor ebx,ebx
lodsb
shl eax,8
loop @@2
shl eax,8
inc ebx
inc ebx
jmp @@_
@@2:
lodsb
shl eax,8
loop @@3
inc ebx
jmp @@_
@@3:
lodsb
dec ecx
@@_:
push ecx
push 4
pop ecx
push ecx
@@:
rol edx,8
mov dl,al
and dl,00111111B
shr eax,6
loop @B
pop ecx
call edx2_b64
xchg eax,edx
stosd
xchg eax,edx
pop ecx
or ecx,ecx
jnz gen_base64
mov ecx,ebx
sub edi,ecx
mov al,"="
rep stosb
ret
edx2_b64:
cmp dl,62
jae dl_62_63
cmp dl,51
ja digit_0_9
add dl,'A'
cmp dl,'Z'
jbe @F
add dl,'a'-'Z'-1
@@:
jmp rotate_edx
digit_0_9:
add dl,30h-52
jmp rotate_edx
dl_62_63:
sub dl,62
shl dl,2
add dl,43
rotate_edx:
rol edx,8
loop edx2_b64
ret
enc.size=$-base64_enc
;IN :ecx=length esi=string edi=outBUF
;OUT:buf=decompress data edx=actual len
;pure code 49 lines and 101 bytes long
;many regs are altered.(you can count it!)
base64_dec:
push edi
shr ecx,2
mov edx,ecx
imul edx,edx,3
next_dword:
push ecx
lodsd
push 4
pop ecx
push ecx
call eax_b64_2_org
pop ecx ;ecx=4!
xor ebx,ebx
bswap eax
@@:
shl eax,2
shld ebx,eax,6
shl eax,6
loop @B
mov eax,ebx
bswap eax
shr eax,8
stosb
shr eax,8
stosw
pop ecx
loop next_dword
pop edi
mov byte [edi+edx],0
ret
eax_b64_2_org:
cmp al,'='
jne @F
xor al,al
dec edx
@@:
cmp al,'/'
ja is_digit_0_9
sub al,'+'
shr al,2
add al,62
jmp rotate_eax
is_digit_0_9:
cmp al,'9'
ja is_alphabet
add al,52-'0'
jmp rotate_eax
is_alphabet:
sub al,'A'
cmp al,25
jbe rotate_eax
sub al,6
rotate_eax:
rol eax,8
loop eax_b64_2_org
ret
b64.dcode.size=$-base64_dec
.end StArT

时间: 2024-10-27 11:15:49

Base64编码的相关文章

用javascript实现Base64编码

javascript|编码 用javascript实现Base64编码-解决中文问题 因javascript求出来的是Unicode要转换成Ansi后才能对它进行Base64编码 UnicodeAnsi.js文件:把Unicode转成Ansi和把Ansi转换成Unicode 代码拷贝框//UnicodeAnsi.js文件//把Unicode转成Ansi和把Ansi转换成Unicodefunction UnicodeChr(){return '00A4,00A7,00A8,00B0,00B1,00

base64编码、解码函数

编码|函数 这是我看完几个base64编码.解码函数后自己改写的.因为,在中文操作系统的VBscript中,使用的是unicode字符集,所以很多base64编码.解码函数在理论上是正确的,但实际不能运行! 我加写了几个Unicode与Ansi编码转换的函数,现贴出来,请大家执教! 文件名称base64test.asp <% sBASE_64_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567

BASE64编码规则及C#实现

编码   一.编码规则      Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据分成4组,即每组6位.再在每组的的最高位前补两个0凑足一个字节.这样就把一个3字节为一组的数据重新编码成了4个字节.当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节.这时在最后一组填充1到2个0字节.并在最后编码完成后在结尾添加1到2个"=".  例:将对AB

base64编码类------源代码(C#)

编码|源代码 using System; namespace shapBse64{ /// <summary> /// 有关base64编码算法的相关操作 ///By 自由奔腾(wgscd) /// </summary> public class SBase64 { public SBase64() { // // TODO: 在此处添加构造函数逻辑 // } //-----------------------------------------------------------

Python base64编码解码实例

  这篇文章主要介绍了Python base64编码解码实例,本文直接给出实例代码,使用也很简单,需要的朋友可以参考下 Python中进行Base64编码和解码要用base64模块,代码示例: ? 1 2 3 4 5 6 7 #-*- coding: utf-8 -*- import base64   str = 'cnblogs' str64 = base64.b64encode(str) print str64 #Y25ibG9ncw== print base64.b64decode(str

js对图片base64编码字符串进行解码并输出图像

 这篇文章主要介绍了js对图片base64编码字符串进行解码并输出图像的具体实现,大家可以参考下面的示例  代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <html xmlns="http://www.w3.org/1999/xh

js显示base64编码的二进制流网页图片

 base64简单地说,它把一些 8-bit 数据翻译成标准 ASCII 字符,我们把图像文件的内容直接写在了HTML 文件中,这样做的好处是,节省了一个HTTP 请求 Data URI scheme.  Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入.比如上面那串字符,其实是一张小图片,将这些字符复制黏贴到火狐的地址栏中并转到,就能看到它了,一张2*2的白色gif图片.  在上面的Data URI中,data表示取得数

在网页中嵌入Base64编码文件

大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如:data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAYAAABIdFAMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAHhJREFUeNo8zjsOxCAMBFB/ KEAUFFR0Cbng3nQPw68ArZdAlOZppPFIBhH5EAB8b+Tlt9MYQ6i1BuqFaq1CK

java base64编码的三种方式

Java 中如何使用base64编码呢? 有如下三种方式: 方式一:commons-codec.jar Java代码   String base64String = "whuang123";           byte[] result = Base64.encodeBase64(base64String.getBytes());     方式二:使用sun.misc.BASE64Encoder Java代码   /**       * 编码       *        * @pa