C#、Java和JS实现SHA256+BASE64加密总结

--莫非(www.muphy.me)

原理

首先,通过编码格式(UTF-8、ASCII等,如果含有汉字等字符,编码格式不同加密结果也不同)获得加密字符串的字节数组,再计算字节数组的哈希值数组,再把hash数组转换为base64编码的字符串。

C#实例

class  Program

   {//转换为base64编码为44位

       public  static  string NewSHA256(string  str)

       {

           //如果str有中文,不同Encoding的sha是不同的!!

          using  (SHA256Managed  sha256 = new SHA256Managed())

           {

              byte[] SHA256Data  =Encoding.UTF8.GetBytes(str);

//SHA256Data  "104,101,108,108,111,32,119,111,114,108,100"

              byte[] by  =sha256.ComputeHash(SHA256Data);

//44位 "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek="

               return  Convert.ToBase64String(by);  

           }

       }

       //转换为十六进制编码为64位  去除了‘-’

       public  static  string SHA256(string  str)

       { //如果str有中文,不同Encoding的sha是不同的!!

          using  (SHA256Managed  sha256 = new SHA256Managed())

           {

              byte[] SHA256Data  =Encoding.UTF8.GetBytes(str);

//SHA256Data "104,101,108,108,111,32,119,111,114,108,100"

              byte[] by  =sha256.ComputeHash(SHA256Data);

//64位 "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"

               return  BitConverter.ToString(by).Replace("-", "").ToLower();

           }

       }

       static  void Main(string[] args)

       {

          string  s  = "hello world";

//sha265:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

          string  sha  = SHA256(s);

          Console.WriteLine("{0}\n{1} \nLength: {2}", s, sha,sha.Length);

          //结果 ”uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=”

       }

}

Java实例

/**

    *  利用java原生的摘要实现SHA256加密

    *@param  str  加密后的报文

    *@return

    */

   public  static  String getSHA256StrJava(String  str){

      MessageDigest  messageDigest;

       String  encodeStr = "";

       try  {

          messageDigest  =MessageDigest.getInstance("SHA-256");

          messageDigest.update(str.getBytes("UTF-8"));

           //转换的方式选择

           //encodeStr  = byte2Hex(messageDigest.digest());//转换成二进制

          encodeStr  =base64Entrypt(messageDigest.digest());//转换成Base64

       } catch  (NoSuchAlgorithmException  e) {

          e.printStackTrace();

       } catch  (UnsupportedEncodingException  e) {

          e.printStackTrace();

       }

       return  encodeStr;

   }

   /**

    *将byte转为16进制

    *@param  bytes

    *@return

    */

   private  static  String byte2Hex(byte[] bytes){

       StringBuffer  stringBuffer = new StringBuffer();

       String  temp  =null;

       for  (int i=;i<bytes.length;i++){

          temp  =Integer.toHexString(bytes[i] & 0xFF);

           if  (temp.length()==){

               //1得到一位的进行补0操作

               stringBuffer.append("");

           }

          stringBuffer.append(temp);

       }

       return  stringBuffer.toString();

}

/**

    *转换为BASE64编码

    *@param  bytes

    *@return

    */

   private  static  String base64Entrypt(byte[] bytes){

   //import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

   return  Base64.encode(bytes);

   }

   private  static  String newBase64Entrypt(byte[] bytes){

        //import sun.misc.BASE64Encoder;

        return  new  BASE64Encoder().encode(bytes);

   }

   /**

    *测试

    *@param  Args

    */

   public  static  void main(String[] Args){

   String str  = "hello  world";

   String sha  = getSHA256StrJava(str);

   System.out.println(str  + ":" + sha);

   //结果:hello world:uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=

}

JS实例

/**

*SHA256加密

*/

function  SHA256(s) {

 var  chrsz = 8;

 var  hexcase = 0;

 function  safe_add(x, y) {

     var  lsw  =(x  & 0xFFFF) + (y  & 0xFFFF);

     var  msw  =(x  >> 16) + (y  >> 16) + (lsw  >> 16);

     return  (msw << 16) | (lsw  &0xFFFF);

 }

 function  S(X, n) {

     return  (X >>> n) | (X  <<(32  - n));

 }

 function  R(X, n) {

     return  (X >>> n);

 }

 function  Ch(x, y, z) {

     return  ((x & y) ^ ((~x) & z));

 }

 function  Maj(x, y, z) {

     return  ((x & y) ^ (x  & z) ^ (y  & z));

 }

 function  Sigma0256(x) {

     return  (S(x, 2) ^ S(x, 13) ^ S(x, 22));

 }

 function  Sigma1256(x) {

     return  (S(x, 6) ^ S(x, 11) ^ S(x, 25));

 }

 function  Gamma0256(x) {

     return  (S(x, 7) ^ S(x, 18) ^ R(x, 3));

 }

 function  Gamma1256(x) {

     return  (S(x, 17) ^ S(x, 19) ^ R(x, 10));

 }

 function  core_sha256(m, l) {

     var  K  = new  Array(0x428A2F98, 0x71374491, 0xB5C0FBCF,0xE9B5DBA5,

             0x3956C25B, 0x59F111F1, 0x923F82A4,0xAB1C5ED5, 0xD807AA98,

             0x12835B01, 0x243185BE,0x550C7DC3, 0x72BE5D74, 0x80DEB1FE,

             0x9BDC06A7, 0xC19BF174,0xE49B69C1, 0xEFBE4786, 0xFC19DC6,

             0x240CA1CC, 0x2DE92C6F,0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,

             0x983E5152, 0xA831C66D, 0xB00327C8,0xBF597FC7, 0xC6E00BF3,

             0xD5A79147, 0x6CA6351, 0x14292967,0x27B70A85, 0x2E1B2138,

             0x4D2C6DFC, 0x53380D13,0x650A7354, 0x766A0ABB, 0x81C2C92E,

             0x92722C85, 0xA2BFE8A1,0xA81A664B, 0xC24B8B70, 0xC76C51A3,

             0xD192E819, 0xD6990624, 0xF40E3585,0x106AA070, 0x19A4C116,

             0x1E376C08, 0x2748774C,0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A,

             0x5B9CCA4F, 0x682E6FF3,0x748F82EE, 0x78A5636F, 0x84C87814,

             0x8CC70208, 0x90BEFFFA,0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);

     var  HASH  =new  Array(0x6A09E667,0xBB67AE85, 0x3C6EF372, 0xA54FF53A,

             0x510E527F, 0x9B05688C,0x1F83D9AB, 0x5BE0CD19);

     var  W  = new  Array(64);

     var  a, b, c, d, e, f, g, h, i, j;

     var  T1, T2;

     m[l >> 5] |= 0x80  <<(24  - l % 32);

     m[((l + 64  >> 9) << 4) +15] = l;

     for  (var  i  = 0;i  < m.length; i  += 16) {

         a = HASH[0];

         b = HASH[1];

         c = HASH[2];

         d = HASH[3];

         e = HASH[4];

         f = HASH[5];

         g = HASH[6];

         h = HASH[7];

         for  (var  j  = 0;j  < 64; j++) {

             if  (j < 16)

                 W[j] = m[j  + i];

             else

                 W[j] =safe_add(safe_add(safe_add(Gamma1256(W[j - 2]),

                         W[j  - 7]), Gamma0256(W[j  - 15])), W[j - 16]);

             T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(

                     e, f, g)), K[j]), W[j]);

             T2 = safe_add(Sigma0256(a), Maj(a, b, c));

             h = g;

             g = f;

             f = e;

             e = safe_add(d, T1);

             d = c;

             c = b;

             b = a;

             a = safe_add(T1, T2);

         }

         HASH[0] = safe_add(a, HASH[0]);

         HASH[1] = safe_add(b, HASH[1]);

         HASH[2] = safe_add(c, HASH[2]);

         HASH[3] = safe_add(d, HASH[3]);

         HASH[4] = safe_add(e, HASH[4]);

         HASH[5] = safe_add(f, HASH[5]);

         HASH[6] = safe_add(g, HASH[6]);

         HASH[7] = safe_add(h, HASH[7]);

     }

     return  HASH;

 }

 function  str2binb(str) {

     var  bin  =Array();

     var  mask  =(1  << chrsz) - 1;

     for  (var  i  = 0;i  < str.length  * chrsz; i += chrsz) {

         bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i  % 32);

     }

     return  bin;

 }

 function  Utf8Encode(string) {

     string = string.replace(/\r\n/g, "\n");

     var  utftext = "";

     for  (var  n  = 0;n  < string.length; n++) {

         var  c  =string.charCodeAt(n);

         if  (c < 128) {

             utftext  += String.fromCharCode(c);

         } else  if  ((c > 127) && (c  <2048)) {

             utftext  += String.fromCharCode((c  >> 6) | 192);

             utftext  += String.fromCharCode((c  & 63) | 128);

         } else  {

             utftext  += String.fromCharCode((c  >> 12) | 224);

             utftext  += String.fromCharCode(((c  >> 6) & 63) | 128);

             utftext  += String.fromCharCode((c  & 63) | 128);

         }

     }

     return  utftext;

 }

 function  binb2hex(binarray) {

     var  hex_tab = hexcase  ? "0123456789ABCDEF" : "0123456789abcdef";

     var  str  = "";

     for  (var  i  = 0;i  < binarray.length  * 4; i++) {

         str += hex_tab

                 .charAt((binarray[i  >> 2] >> ((3  - i  %4) * 8  + 4)) & 0xF)

                 + hex_tab.charAt((binarray[i>> 2] >> ((3 - i % 4) * 8)) & 0xF);

     }

     return  str;

 }

 s  =Utf8Encode(s);

 return  binb2hex(core_sha256(str2binb(s), s.length *chrsz));

}

C#、Java和JS实现SHA256+BASE64加密总结

--莫非(www.muphy.me)

原理

首先,通过编码格式(UTF-8、ASCII等,如果含有汉字等字符,编码格式不同加密结果也不同)获得加密字符串的字节数组,再计算字节数组的哈希值数组,再把hash数组转换为base64编码的字符串。

C#实例

class  Program

{//转换为base64编码为44位

public  static  string NewSHA256(string  str)

{

//如果str有中文,不同Encoding的sha是不同的!!

using  (SHA256Managed  sha256 = new SHA256Managed())

{

byte[] SHA256Data  =Encoding.UTF8.GetBytes(str);

//SHA256Data  "104,101,108,108,111,32,119,111,114,108,100"

byte[] by  =sha256.ComputeHash(SHA256Data);

//44位 "uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek="

return  Convert.ToBase64String(by);

}

}

//转换为十六进制编码为64位  去除了‘-’

public  static  string SHA256(string  str)

{ //如果str有中文,不同Encoding的sha是不同的!!

using  (SHA256Managed  sha256 = new SHA256Managed())

{

byte[] SHA256Data  =Encoding.UTF8.GetBytes(str);

//SHA256Data "104,101,108,108,111,32,119,111,114,108,100"

byte[] by  =sha256.ComputeHash(SHA256Data);

//64位 "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9"

return  BitConverter.ToString(by).Replace("-", "").ToLower();

}

}

static  void Main(string[] args)

{

string  s  = "hello world";

//sha265:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

string  sha  = SHA256(s);

Console.WriteLine("{0}\n{1} \nLength: {2}", s, sha,sha.Length);

//结果 ”uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=”

}

}

Java实例

/**

*  利用java原生的摘要实现SHA256加密

*@param  str  加密后的报文

*@return

*/

public  static  String getSHA256StrJava(String  str){

MessageDigest  messageDigest;

String  encodeStr = "";

try  {

messageDigest  =MessageDigest.getInstance("SHA-256");

messageDigest.update(str.getBytes("UTF-8"));

//转换的方式选择

//encodeStr  = byte2Hex(messageDigest.digest());//转换成二进制

encodeStr  =base64Entrypt(messageDigest.digest());//转换成Base64

catch  (NoSuchAlgorithmException  e) {

e.printStackTrace();

catch  (UnsupportedEncodingException  e) {

e.printStackTrace();

}

return  encodeStr;

}

/**

*将byte转为16进制

*@param  bytes

*@return

*/

private  static  String byte2Hex(byte[] bytes){

StringBuffer  stringBuffer = new StringBuffer();

String  temp  =null;

for  (int i=0;i<bytes.length;i++){

temp  =Integer.toHexString(bytes[i] & 0xFF);

if  (temp.length()==1){

//1得到一位的进行补0操作

stringBuffer.append("0");

}

stringBuffer.append(temp);

}

return  stringBuffer.toString();

}

/**

*转换为BASE64编码

*@param  bytes

*@return

*/

private  static  String base64Entrypt(byte[] bytes){

//import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;

return  Base64.encode(bytes);

}

private  static  String newBase64Entrypt(byte[] bytes){

//import sun.misc.BASE64Encoder;

return  new  BASE64Encoder().encode(bytes);

}

/**

*测试

*@param  Args

*/

public  static  void main(String[] Args){

String str  = "hello  world";

String sha  = getSHA256StrJava(str);

System.out.println(str  + ":" + sha);

//结果:hello world:uU0nuZNNPgilLlLX2n2r+sSE7+N6U4DukIj3rOLvzek=

}

JS实例

/**

*SHA256加密

*/

function  SHA256(s) {

var  chrsz = 8;

var  hexcase = 0;

function  safe_add(x, y) {

var  lsw  =(x  & 0xFFFF) + (y  & 0xFFFF);

var  msw  =(x  >> 16) + (y  >> 16) + (lsw  >> 16);

return  (msw << 16) | (lsw  &0xFFFF);

}

function  S(X, n) {

return  (X >>> n) | (X  <<(32  - n));

}

function  R(X, n) {

return  (X >>> n);

}

function  Ch(x, y, z) {

return  ((x & y) ^ ((~x) & z));

}

function  Maj(x, y, z) {

return  ((x & y) ^ (x  & z) ^ (y  & z));

}

function  Sigma0256(x) {

return  (S(x, 2) ^ S(x, 13) ^ S(x, 22));

}

function  Sigma1256(x) {

return  (S(x, 6) ^ S(x, 11) ^ S(x, 25));

}

function  Gamma0256(x) {

return  (S(x, 7) ^ S(x, 18) ^ R(x, 3));

}

function  Gamma1256(x) {

return  (S(x, 17) ^ S(x, 19) ^ R(x, 10));

}

function  core_sha256(m, l) {

var  K  = new  Array(0x428A2F98, 0x71374491, 0xB5C0FBCF,0xE9B5DBA5,

0x3956C25B, 0x59F111F1, 0x923F82A4,0xAB1C5ED5, 0xD807AA98,

0x12835B01, 0x243185BE,0x550C7DC3, 0x72BE5D74, 0x80DEB1FE,

0x9BDC06A7, 0xC19BF174,0xE49B69C1, 0xEFBE4786, 0xFC19DC6,

0x240CA1CC, 0x2DE92C6F,0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,

0x983E5152, 0xA831C66D, 0xB00327C8,0xBF597FC7, 0xC6E00BF3,

0xD5A79147, 0x6CA6351, 0x14292967,0x27B70A85, 0x2E1B2138,

0x4D2C6DFC, 0x53380D13,0x650A7354, 0x766A0ABB, 0x81C2C92E,

0x92722C85, 0xA2BFE8A1,0xA81A664B, 0xC24B8B70, 0xC76C51A3,

0xD192E819, 0xD6990624, 0xF40E3585,0x106AA070, 0x19A4C116,

0x1E376C08, 0x2748774C,0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A,

0x5B9CCA4F, 0x682E6FF3,0x748F82EE, 0x78A5636F, 0x84C87814,

0x8CC70208, 0x90BEFFFA,0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);

var  HASH  =new  Array(0x6A09E667,0xBB67AE85, 0x3C6EF372, 0xA54FF53A,

0x510E527F, 0x9B05688C,0x1F83D9AB, 0x5BE0CD19);

var  W  = new  Array(64);

var  a, b, c, d, e, f, g, h, i, j;

var  T1, T2;

m[l >> 5] |= 0x80  <<(24  - l % 32);

m[((l + 64  >> 9) << 4) +15] = l;

for  (var  i  = 0;i  < m.length; i  += 16) {

a = HASH[0];

b = HASH[1];

c = HASH[2];

d = HASH[3];

e = HASH[4];

f = HASH[5];

g = HASH[6];

h = HASH[7];

for  (var  j  = 0;j  < 64; j++) {

if  (j < 16)

W[j] = m[j  + i];

else

W[j] =safe_add(safe_add(safe_add(Gamma1256(W[j - 2]),

W[j  - 7]), Gamma0256(W[j  - 15])), W[j - 16]);

T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(

e, f, g)), K[j]), W[j]);

T2 = safe_add(Sigma0256(a), Maj(a, b, c));

h = g;

g = f;

f = e;

e = safe_add(d, T1);

d = c;

c = b;

b = a;

a = safe_add(T1, T2);

}

HASH[0] = safe_add(a, HASH[0]);

HASH[1] = safe_add(b, HASH[1]);

HASH[2] = safe_add(c, HASH[2]);

HASH[3] = safe_add(d, HASH[3]);

HASH[4] = safe_add(e, HASH[4]);

HASH[5] = safe_add(f, HASH[5]);

HASH[6] = safe_add(g, HASH[6]);

HASH[7] = safe_add(h, HASH[7]);

}

return  HASH;

}

function  str2binb(str) {

var  bin  =Array();

var  mask  =(1  << chrsz) - 1;

for  (var  i  = 0;i  < str.length  * chrsz; i += chrsz) {

bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i  % 32);

}

return  bin;

}

function  Utf8Encode(string) {

string = string.replace(/\r\n/g, "\n");

var  utftext = "";

for  (var  n  = 0;n  < string.length; n++) {

var  c  =string.charCodeAt(n);

if  (c < 128) {

utftext  += String.fromCharCode(c);

else  if  ((c > 127) && (c  <2048)) {

utftext  += String.fromCharCode((c  >> 6) | 192);

utftext  += String.fromCharCode((c  & 63) | 128);

else  {

utftext  += String.fromCharCode((c  >> 12) | 224);

utftext  += String.fromCharCode(((c  >> 6) & 63) | 128);

utftext  += String.fromCharCode((c  & 63) | 128);

}

}

return  utftext;

}

function  binb2hex(binarray) {

var  hex_tab = hexcase  ? "0123456789ABCDEF" : "0123456789abcdef";

var  str  = "";

for  (var  i  = 0;i  < binarray.length  * 4; i++) {

str += hex_tab

.charAt((binarray[i  >> 2] >> ((3  - i  %4) * 8  + 4)) & 0xF)

+ hex_tab.charAt((binarray[i>> 2] >> ((3 - i % 4) * 8)) & 0xF);

}

return  str;

}

s  =Utf8Encode(s);

return  binb2hex(core_sha256(str2binb(s), s.length *chrsz));

}

C#、Java和JS实现SHA256+BASE64加密总结的更多相关文章

  1. JS URL 使用base64加密与解密

    JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...

  2. JS URL 使用base64加密与解密和MD5解密

    JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...

  3. js中变量base64加密传输

    首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...

  4. JS实现的base64加密、md5加密及sha1加密详解

    1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...

  5. js中实现base64加密、解密

    //base64加密 解密 /* //1.加密 var result = Base.encode('125中文'); //--> "MTI15Lit5paH" //2.解密 ...

  6. 【js】JS实现的base64加密、md5加密及sha1加密详解

    参考链接 http://www.jb51.net/article/82831.htm

  7. Java 和JS Base64加密

    项目在登录.注册等场景实现时,经常会用到用户信息前端加密,然后项目后端二次解密,避免信息直接在浏览器上以明文显示. 本文主要介绍了base64加密的方式处理代码,不支持中文 源码如下: base64. ...

  8. js base64加密,后台解密

    这是为了解决页面发送post请求,传输密码,在页面的控制台可以看到密码的明文,所以先用base64把要传输的密码转换为非明文,然后在后台解密处理. base64encode.js // base64加 ...

  9. jquery对中文进行base64加密,后台用java进行base64解密

    项目中遇到将中文从前台传到后台过程中,出现乱码,一番尝试之后,均是乱码,然后尝试在js代码中先进行base64加密,然后在Java中再进行解密,完美的解决了乱码问题,步骤如下 一,html页面引入jQ ...

随机推荐

  1. Object.keys 及表单清空

    Object.keys 返回一个所有元素为字符串的数组,其元素来自于从给定的object上面可直接枚举的属性.这些属性的顺序与手动遍历该对象属性时的一致. // simple array var ar ...

  2. OPC协议解析-OPC UA OPC统一架构

    1    什么是OPC UA 为了应对标准化和跨平台的趋势,为了更好的推广OPC,OPC基金会近些年在之前OPC成功应用的基础上推出了一个新的OPC标准-OPC UA.OPC UA接口协议包含了之前的 ...

  3. Approval Process 在 Apex 中的使用

    Approval Process(批准过程)简介 批准过程是一个复杂的业务过程.详细的内容可以参考官方文档. 英文版 中文版 官方trailhead模块 在Apex中调用Approval Proces ...

  4. keras & tensorflow 列出可用GPU 和 切换CPU & GPU

    列出可用GPU from tensorflow.python.client import device_lib print(device_lib.list_local_devices()) from ...

  5. axios中的this指向问题

    最近在使用vue过程中,使用axios进行接口请求,确发现取不到值,返回为undefined. show (item) { let searchText = item.keyword console. ...

  6. Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

    ionic build Android后的报错问题 ionic 升级了splashscreen和statusbar的插件后,执行ionic build android会一直报打包错误.原因是过低的An ...

  7. Vue一个案例引发的递归组件的使用

    今天我们继续使用 Vue 的撸我们的实战项目,只有在实战中我们才会领悟更多,光纸上谈兵然并卵,继上篇我们的<Vue一个案例引发的动态组件与全局事件绑定总结> 之后,今天来聊一聊我们如何在项 ...

  8. LeetCode算法题-Repeated String Match(Java实现)

    这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...

  9. android的listview以及画线--to thi tha

    https://www.cnblogs.com/896240130Master/p/6135165.html 这个的 https://www.jianshu.com/p/5522470760c1

  10. ORACLESQL语句的优化

    ORACLESQL语句的优化: 选择最有效率的表名顺序:应该选择记录条数最少的表作为基表! 因为Oracle解析器的处理顺序是从右至左的.当ORACLE处理多个表时, 会运用排序及合并的方式连接它们. ...