js字符串加密的几种方法

在做web前端的时候免不了要用javascript来处理一些简单操作,其实如果要用好JQuery, Prototype,Dojo 等其中一两个javascript框架并不简单,它提高你的web交互和用户体验,从而能使你的web前端有非一样的感觉,如海阔凭鱼跃。当然,对于javascript我也是半桶水。高手莫怪,在此我仅总结学习一下,以备用到时查录。

今天不说框架的事情,就从最基本的、比较常用的javascript代码入手。

先说简单字符串加密的事情

 

复制代码
/* 8进制加密 */
function  EnEight(){
    
var  monyer  =   new  Array(); var  i,s;
    
for (i = 0 ;i < txt.value.length;i ++ )
        monyer
+= " \\ " + txt.value.charCodeAt(i).toString( 8 ); 
    txt.value
= monyer;
}
/* 8进制解密 */
function  DeEight(){
    
var  monyer  =   new  Array(); var  i;
    
var  s = txt.value.split( " \\ " );
    
for (i = 1 ;i < s.length;i ++ )
        monyer
+= String.fromCharCode(parseInt(s[i], 8 ));
    txt.value
= monyer;
}
复制代码
/* 10进制加密 */
function  Encrypt(){
    
var  monyer  =   new  Array(); var  i,s;
    
for (i = 0 ;i < txt.value.length;i ++ ){
        s
= txt.value.charCodeAt(i).toString( 16 ); 
        
if (Decimal1.checked) monyer += " &# " + txt.value.charCodeAt(i) + " ; " ;
        
else   if  (Decimal2.checked) monyer += " &# " + new  Array( 7 - String(s).length).join( " 0 " ) + txt.value.charCodeAt(i);
        
else  monyer += txt.value.charCodeAt(i) + " , " ;
    }txt.value
= monyer;
}
/* 10进制解密 */
function  Decrypt(){
    
var  monyer  =   new  Array(); var  i;
    
if (Decimal1.checked){
        
var  s = txt.value.split( " ; " );
        
for (i = 0 ;i < s.length;i ++ ){
            s[i]
= s[i].replace( ' &# ' , '' );
            monyer
+= String.fromCharCode(s[i]);
        }
    }
else   if (Decimal2.checked){
        
var  s = txt.value.split( " & " );
        
for (i = 1 ;i < s.length;i ++ ){
            s[i]
= s[i].replace( ' # ' , '' );
            monyer
+= String.fromCharCode(s[i]);
        }
    }
else {
        
var  s = txt.value.split( " , " );
        
for (i = 0 ;i < s.length;i ++ )
            monyer
+= String.fromCharCode(s[i]);
    }txt.value
= monyer;
}
复制代码
/* 16进制加密 */
function  JavaEn(){
    
var  monyer  =   new  Array(); var  i,s;
    
for (i = 0 ;i < txt.value.length;i ++ ){
        s
= txt.value.charCodeAt(i).toString( 16 ); 
        
if (hex1.checked) monyer += " \\u " + new  Array( 5 - String(s).length).join( " 0 " ) + s;
        
else   if (hex2.checked) monyer += " &#x " + new  Array( 5 - String(s).length).join( " 0 " ) + s + " ; " ;
        
else   if (hex3.checked) monyer += " \\x " + new  Array( 5 - String(s).length).join( " 0 " ) + s;
        
else  monyer += " \\ " + new  Array( 5 - String(s).length).join( " 0 " ) + s;
    }txt.value
= monyer;
}
var  p = document.documentElement.outerHTML.length;
/* 16进制解密 */
function  JavaDe(){
    
if (hex1.checked){
        
var  monyer  =   new  Array(); var  i;
        
var  s = txt.value.split( " \\ " );
        
for (i = 1 ;i < s.length;i ++ ){
            s[i]
= s[i].replace( ' u ' , '' );
            monyer
+= String.fromCharCode(parseInt(s[i], 16 ));
        }
    }
else   if (hex2.checked){
        
var  monyer  =   new  Array(); var  i;
        
var  s = txt.value.split( " ; " );
        
for (i = 0 ;i < s.length;i ++ ){
            s[i]
= s[i].replace( ' &#x ' , '' );
            monyer
+= String.fromCharCode(parseInt(s[i], 16 ));
        }
    }
    
else   if (hex3.checked){
        
var  monyer  =   new  Array(); var  i;
        
var  s = txt.value.split( " \\ " );
        
for (i = 1 ;i < s.length;i ++ ){
            s[i]
= s[i].replace( ' x ' , '' );
            monyer
+= String.fromCharCode(parseInt(s[i], 16 ));
        }
    }
else {
        
var  monyer  =   new  Array(); var  i;
        
var  s = txt.value.split( " \\ " );
        
for (i = 1 ;i < s.length;i ++ )
            monyer
+= String.fromCharCode(parseInt(s[i], 16 ));
    }txt.value
= monyer;
}
/* 任意进制加密 */
function  EnChTo(h){
    
var  monyer  =   new  Array(); var  i,s;
    
for (i = 0 ;i < txt.value.length;i ++ )
        monyer
+= txt.value.charCodeAt(i).toString(h) + "   "
    txt.value
= monyer;
}
/* 任意进制解密 */
function  DeChTo(h){
    
var  monyer  =   new  Array(); var  i;
    
var  s = txt.value.split( "   " );
    
for (i = 0 ;i < s.length;i ++ )
        monyer
+= String.fromCharCode(parseInt(s[i],h));
    txt.value
= monyer;
}
复制代码
复制代码
复制代码

 

加密类似URL的字符

 

 View Code

 //html Encode

复制代码
   function  HtmlEncode(i)
                {
                
if  (i  ==   1 )
                    txt.value
                        
=  txt.value.replace( / & / g,  ' &amp; ' ).replace( / \" / g,  ' &quot; ' ).replace( / < / g,  ' &lt; ' ).replace( / > / g,
                                                                                                                  
' &gt; ' );

                
if  (i  ==   2 )
                    txt.value
                        
=  txt.value.replace( / &amp; / g,  ' & ' ).replace( / &quot; / g,  ' \" ' ).replace( / &lt; / g,
                                                                                            
' < ' ).replace( / &gt; / g,  ' > ' )
                }

            
var  hex_chr  =   " 0123456789abcdef " ;

            
function  rhex(num)
                {
                str 
=   "" ;

                
for  (j  =   0 ; j  <=   3 ; j ++ )
                    str 
+=  hex_chr.charAt((num  >>  (j  *   8   +   4 ))  &   0x0F +  hex_chr.charAt((num  >>  (j  *   8 ))  &   0x0F );

                
return  str
                }
复制代码

 

//base64

 

复制代码
  var  base64EncodeChars  =   " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ " ;
            
var  base64DecodeChars  =   new  Array( - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 ,
                                              
- 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 ,
                                              
- 1 - 1 - 1 - 1 - 1 - 1 - 1 62 - 1 - 1 - 1 63 52 53 54 55 56 57 ,
                                              
58 59 60 61 - 1 - 1 - 1 - 1 - 1 - 1 - 1 0 ,   1 ,   2 ,   3 ,   4 ,   5 ,   6 ,
                                              
7 ,   8 ,   9 ,   10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ,
                                              
25 - 1 - 1 - 1 - 1 - 1 - 1 26 27 28 29 30 31 32 33 34 35 36 ,
                                              
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 - 1 - 1 - 1 ,
                                              
- 1 - 1 );

            
function  base64encode(str)
                {
                
var  out, i, len;
                
var  c1, c2, c3;
                len 
=  str.length;
                i 
=   0 ;
                out 
=   "" ;

                
while  (i  <  len)
                    {
                    c1 
=  str.charCodeAt(i ++ &   0xff ;

                    
if  (i  ==  len)
                        {
                        out 
+=  base64EncodeChars.charAt(c1  >>   2 );
                        out 
+=  base64EncodeChars.charAt((c1  &   0x3 <<   4 );
                        out 
+=   " == " ;
                        
break
                        }

                    c2 
=  str.charCodeAt(i ++ );

                    
if  (i  ==  len)
                        {
                        out 
+=  base64EncodeChars.charAt(c1  >>   2 );
                        out 
+=  base64EncodeChars.charAt(((c1  &   0x3 <<   4 |  ((c2  &   0xF0 >>   4 ));
                        out 
+=  base64EncodeChars.charAt((c2  &   0xF <<   2 );
                        out 
+=   " = " ;
                        
break
                        }

                    c3 
=  str.charCodeAt(i ++ );
                    out 
+=  base64EncodeChars.charAt(c1  >>   2 );
                    out 
+=  base64EncodeChars.charAt(((c1  &   0x3 <<   4 |  ((c2  &   0xF0 >>   4 ));
                    out 
+=  base64EncodeChars.charAt(((c2  &   0xF <<   2 |  ((c3  &   0xC0 >>   6 ));
                    out 
+=  base64EncodeChars.charAt(c3  &   0x3F )
                    }

                
return  out
                }

            
function  base64decode(str)
                {
                
var  c1, c2, c3, c4;
                
var  i, len, out;
                len 
=  str.length;
                i 
=   0 ;
                out 
=   "" ;

                
while  (i  <  len)
                    {
                    
do
                        {
                        c1 
=  base64DecodeChars[str.charCodeAt(i ++ &   0xff ]
                        } 
while  (i  <  len  &&  c1  ==   - 1 );

                    
if  (c1  ==   - 1 )
                        
break ;

                    
do
                        {
                        c2 
=  base64DecodeChars[str.charCodeAt(i ++ &   0xff ]
                        } 
while  (i  <  len  &&  c2  ==   - 1 );

                    
if  (c2  ==   - 1 )
                        
break ;

                    out 
+=  String.fromCharCode((c1  <<   2 |  ((c2  &   0x30 >>   4 ));

                    
do
                        {
                        c3 
=  str.charCodeAt(i ++ &   0xff ;

                        
if  (c3  ==   61 )
                            
return  out;

                        c3 
=  base64DecodeChars[c3]
                        } 
while  (i  <  len  &&  c3  ==   - 1 );

                    
if  (c3  ==   - 1 )
                        
break ;

                    out 
+=  String.fromCharCode(((c2  &   0XF <<   4 |  ((c3  &   0x3C >>   2 ));

                    
do
                        {
                        c4 
=  str.charCodeAt(i ++ &   0xff ;

                        
if  (c4  ==   61 )
                            
return  out;

                        c4 
=  base64DecodeChars[c4]
                        } 
while  (i  <  len  &&  c4  ==   - 1 );

                    
if  (c4  ==   - 1 )
                        
break ;

                    out 
+=  String.fromCharCode(((c3  &   0x03 <<   6 |  c4)
                    }

                
return  out
                }
复制代码

//utf8 <->16

 

复制代码
  function  utf16to8(str)
                {
                
var  out, i, len, c;
                out 
=   "" ;
                len 
=  str.length;

                
for  (i  =   0 ; i  <  len; i ++ )
                    {
                    c 
=  str.charCodeAt(i);

                    
if  ((c  >=   0x0001 &&  (c  <=   0x007F ))
                        {
                        out 
+=  str.charAt(i)
                        }

                    
else   if  (c  >   0x07FF )
                        {
                        out 
+=  String.fromCharCode( 0xE0   |  ((c  >>   12 &   0x0F ));
                        out 
+=  String.fromCharCode( 0x80   |  ((c  >>   6 &   0x3F ));
                        out 
+=  String.fromCharCode( 0x80   |  ((c  >>   0 &   0x3F ))
                        }

                    
else
                        {
                        out 
+=  String.fromCharCode( 0xC0   |  ((c  >>   6 &   0x1F ));
                        out 
+=  String.fromCharCode( 0x80   |  ((c  >>   0 &   0x3F ))
                        }
                    }

                
return  out
                }

            
function  utf8to16(str)
                {
                
var  out, i, len, c;
                
var  char2, char3;
                out 
=   "" ;
                len 
=  str.length;
                i 
=   0 ;

                
while  (i  <  len)
                    {
                    c 
=  str.charCodeAt(i ++ );

                    
switch  (c  >>   4 )
                        {
                        
case   0 :
                        
case   1 :
                        
case   2 :
                        
case   3 :
                        
case   4 :
                        
case   5 :
                        
case   6 :
                        
case   7 :
                            out 
+=  str.charAt(i  -   1 );

                            
break ;

                        
case   12 :
                        
case   13 :
                            char2 
=  str.charCodeAt(i ++ );

                            out 
+=  String.fromCharCode(((c  &   0x1F <<   6 |  (char2  &   0x3F ));
                            
break ;

                        
case   14 :
                            char2 
=  str.charCodeAt(i ++ );

                            char3 
=  str.charCodeAt(i ++ );
                            out 
+=  String.fromCharCode(((c  &   0x0F <<   12 |  ((char2  &   0x3F <<   6 )
                                                           
|  ((char3  &   0x3F <<   0 ));
                            
break
                        }
                    }

                
return  out
                }
复制代码

 

 

//MD5

复制代码
  function  str2blks_MD5(str)
                {
                nblk 
=  ((str.length  +   8 >>   6 +   1 ;
                blks 
=   new  Array(nblk  *   16 );

                
for  (i  =   0 ; i  <  nblk  *   16 ; i ++ )
                    blks[i] 
=   0 ;

                
for  (i  =   0 ; i  <  str.length; i ++ )
                    blks[i 
>>   2 |=  str.charCodeAt(i)  <<  ((i  %   4 *   8 );

                blks[i 
>>   2 |=   0x80   <<  ((i  %   4 *   8 );
                blks[nblk 
*   16   -   2 =  str.length  *   8 ;
                
return  blks
                }

            
function  add(x, y)
                {
                
var  lsw  =  (x  &   0xFFFF +  (y  &   0xFFFF );
                
var  msw  =  (x  >>   16 +  (y  >>   16 +  (lsw  >>   16 );
                
return  (msw  <<   16 |  (lsw  &   0xFFFF )
                }

            
function  rol(num, cnt)
                {
                
return  (num  <<  cnt)  |  (num  >>>  ( 32   -  cnt))
                }

            
function  cmn(q, a, b, x, s, t)
                {
                
return  add(rol(add(add(a, q), add(x, t)), s), b)
                }

            
function  ff(a, b, c, d, x, s, t)
                {
                
return  cmn((b  &  c)  |  (( ~ b)  &  d), a, b, x, s, t)
                }

            
function  gg(a, b, c, d, x, s, t)
                {
                
return  cmn((b  &  d)  |  (c  &  ( ~ d)), a, b, x, s, t)
                }

            
function  hh(a, b, c, d, x, s, t)
                {
                
return  cmn(b  ^  c  ^  d, a, b, x, s, t)
                }

            
function  ii(a, b, c, d, x, s, t)
                {
                
return  cmn(c  ^  (b  |  ( ~ d)), a, b, x, s, t)
                }

            
function  calcMD5(str)
                {
                x 
=  str2blks_MD5(str);
                a 
=   1732584193 ;
                b 
=   - 271733879 ;
                c 
=   - 1732584194 ;
                d 
=   271733878 ;

                
for  (i  =   0 ; i  <  x.length; i  +=   16 )
                    {
                    olda 
=  a;
                    oldb 
=  b;
                    oldc 
=  c;
                    oldd 
=  d;
                    a 
=  ff(a, b, c, d, x[i  +   0 ],  7 - 680876936 );
                    d 
=  ff(d, a, b, c, x[i  +   1 ],  12 - 389564586 );
                    c 
=  ff(c, d, a, b, x[i  +   2 ],  17 606105819 );
                    b 
=  ff(b, c, d, a, x[i  +   3 ],  22 - 1044525330 );
                    a 
=  ff(a, b, c, d, x[i  +   4 ],  7 - 176418897 );
                    d 
=  ff(d, a, b, c, x[i  +   5 ],  12 1200080426 );
                    c 
=  ff(c, d, a, b, x[i  +   6 ],  17 - 1473231341 );
                    b 
=  ff(b, c, d, a, x[i  +   7 ],  22 - 45705983 );
                    a 
=  ff(a, b, c, d, x[i  +   8 ],  7 1770035416 );
                    d 
=  ff(d, a, b, c, x[i  +   9 ],  12 - 1958414417 );
                    c 
=  ff(c, d, a, b, x[i  +   10 ],  17 - 42063 );
                    b 
=  ff(b, c, d, a, x[i  +   11 ],  22 - 1990404162 );
                    a 
=  ff(a, b, c, d, x[i  +   12 ],  7 1804603682 );
                    d 
=  ff(d, a, b, c, x[i  +   13 ],  12 - 40341101 );
                    c 
=  ff(c, d, a, b, x[i  +   14 ],  17 - 1502002290 );
                    b 
=  ff(b, c, d, a, x[i  +   15 ],  22 1236535329 );
                    a 
=  gg(a, b, c, d, x[i  +   1 ],  5 - 165796510 );
                    d 
=  gg(d, a, b, c, x[i  +   6 ],  9 - 1069501632 );
                    c 
=  gg(c, d, a, b, x[i  +   11 ],  14 643717713 );
                    b 
=  gg(b, c, d, a, x[i  +   0 ],  20 - 373897302 );
                    a 
=  gg(a, b, c, d, x[i  +   5 ],  5 - 701558691 );
                    d 
=  gg(d, a, b, c, x[i  +   10 ],  9 38016083 );
                    c 
=  gg(c, d, a, b, x[i  +   15 ],  14 - 660478335 );
                    b 
=  gg(b, c, d, a, x[i  +   4 ],  20 - 405537848 );
                    a 
=  gg(a, b, c, d, x[i  +   9 ],  5 568446438 );
                    d 
=  gg(d, a, b, c, x[i  +   14 ],  9 - 1019803690 );
                    c 
=  gg(c, d, a, b, x[i  +   3 ],  14 - 187363961 );
                    b 
=  gg(b, c, d, a, x[i  +   8 ],  20 1163531501 );
                    a 
=  gg(a, b, c, d, x[i  +   13 ],  5 - 1444681467 );
                    d 
=  gg(d, a, b, c, x[i  +   2 ],  9 - 51403784 );
                    c 
=  gg(c, d, a, b, x[i  +   7 ],  14 1735328473 );
                    b 
=  gg(b, c, d, a, x[i  +   12 ],  20 - 1926607734 );
                    a 
=  hh(a, b, c, d, x[i  +   5 ],  4 - 378558 );
                    d 
=  hh(d, a, b, c, x[i  +   8 ],  11 - 2022574463 );
                    c 
=  hh(c, d, a, b, x[i  +   11 ],  16 1839030562 );
                    b 
=  hh(b, c, d, a, x[i  +   14 ],  23 - 35309556 );
                    a 
=  hh(a, b, c, d, x[i  +   1 ],  4 - 1530992060 );
                    d 
=  hh(d, a, b, c, x[i  +   4 ],  11 1272893353 );
                    c 
=  hh(c, d, a, b, x[i  +   7 ],  16 - 155497632 );
                    b 
=  hh(b, c, d, a, x[i  +   10 ],  23 - 1094730640 );
                    a 
=  hh(a, b, c, d, x[i  +   13 ],  4 681279174 );
                    d 
=  hh(d, a, b, c, x[i  +   0 ],  11 - 358537222 );
                    c 
=  hh(c, d, a, b, x[i  +   3 ],  16 - 722521979 );
                    b 
=  hh(b, c, d, a, x[i  +   6 ],  23 76029189 );
                    a 
=  hh(a, b, c, d, x[i  +   9 ],  4 - 640364487 );
                    d 
=  hh(d, a, b, c, x[i  +   12 ],  11 - 421815835 );


                    c 
=  hh(c, d, a, b, x[i  +   15 ],  16 530742520 );
                    b 
=  hh(b, c, d, a, x[i  +   2 ],  23 - 995338651 );
                    a 
=  ii(a, b, c, d, x[i  +   0 ],  6 - 198630844 );
                    d 
=  ii(d, a, b, c, x[i  +   7 ],  10 1126891415 );
                    c 
=  ii(c, d, a, b, x[i  +   14 ],  15 - 1416354905 );
                    b 
=  ii(b, c, d, a, x[i  +   5 ],  21 - 57434055 );
                    a 
=  ii(a, b, c, d, x[i  +   12 ],  6 1700485571 );
                    d 
=  ii(d, a, b, c, x[i  +   3 ],  10 - 1894986606 );
                    c 
=  ii(c, d, a, b, x[i  +   10 ],  15 - 1051523 );
                    b 
=  ii(b, c, d, a, x[i  +   1 ],  21 - 2054922799 );
                    a 
=  ii(a, b, c, d, x[i  +   8 ],  6 1873313359 );
                    d 
=  ii(d, a, b, c, x[i  +   15 ],  10 - 30611744 );
                    c 
=  ii(c, d, a, b, x[i  +   6 ],  15 - 1560198380 );
                    b 
=  ii(b, c, d, a, x[i  +   13 ],  21 1309151649 );
                    a 
=  ii(a, b, c, d, x[i  +   4 ],  6 - 145523070 );
                    d 
=  ii(d, a, b, c, x[i  +   11 ],  10 - 1120210379 );
                    c 
=  ii(c, d, a, b, x[i  +   2 ],  15 718787259 );
                    b 
=  ii(b, c, d, a, x[i  +   9 ],  21 - 343485551 );
                    a 
=  add(a, olda);
                    b 
=  add(b, oldb);
                    c 
=  add(c, oldc);
                    d 
=  add(d, oldd)
                    }

                
return  rhex(a)  +  rhex(b)  +  rhex(c)  +  rhex(d)
                }
复制代码
前端加密有以下几种方式: 1. 对称加密:使用相同的密钥进行加密和解密,常见的算法有DES、3DES、AES等。实现方式如下: ```javascript // 加密 function encryptByAES(message, secretKey) { const key = CryptoJS.enc.Utf8.parse(secretKey); const encrypted = CryptoJS.AES.encrypt(message, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return encrypted.toString(); } // 解密 function decryptByAES(ciphertext, secretKey) { const key = CryptoJS.enc.Utf8.parse(secretKey); const decrypted = CryptoJS.AES.decrypt(ciphertext, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); return decrypted.toString(CryptoJS.enc.Utf8); } ``` 2. 非对称加密:使用公钥和私钥进行加密和解密,常见的算法有RSA、DSA等。实现方式如下: ```javascript // 生成公钥和私钥 const keyPair = window.crypto.subtle.generateKey( { name: "RSA-OAEP", modulusLength: 2048, publicExponent: new Uint8Array([1, 0, 1]), // 65537 hash: "SHA-256" }, true, ["encrypt", "decrypt"] ); // 加密 async function encryptByRSA(message, publicKey) { const encodedMessage = new TextEncoder().encode(message); const encrypted = await window.crypto.subtle.encrypt( { name: "RSA-OAEP" }, publicKey, encodedMessage ); return window.btoa(String.fromCharCode(...new Uint8Array(encrypted))); } // 解密 async function decryptByRSA(ciphertext, privateKey) { const decodedCiphertext = Uint8Array.from( atob(ciphertext), c => c.charCodeAt(0) ); const decrypted = await window.crypto.subtle.decrypt( { name: "RSA-OAEP" }, privateKey, decodedCiphertext ); return new TextDecoder().decode(decrypted); } ``` 3. 散列加密:将数据转化为固定长度的散列值,常见的算法有MD5、SHA-1、SHA-256等。实现方式如下: ```javascript // 计算MD5散列值 function hashByMD5(message) { return CryptoJS.MD5(message).toString(); } // 计算SHA-256散列值 function hashBySHA256(message) { return CryptoJS.SHA256(message).toString(); } ``` 4. 混淆加密:通过混淆代码或者加入噪音的方式来增强安全性,常见的方式有代码混淆、字符替换等。实现方式如下: ```javascript // 字符串替换 function replaceChars(str) { return str.replace(/a/g, "@").replace(/e/g, "3").replace(/i/g, "1"); } // 代码混淆 function obfuscateCode(code) { // 实现方式可以使用自己的加密算法,这里只是示例 return code.split("").reverse().join(""); } ``` 需要注意的是,以上示例代码只是参考实现,实际情况需要根据具体需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值