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加密總結
--莫非(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));
}
