?? sha256.java
字號:
import java.math.BigInteger;public class sha256 { /** * @param args */// public static void main(String[] args) {//// //al multiplicar por 8 en el L, hay que ponerle que sea de tipo long para que no se pase y que ocupe los 64 que tiene que ocupar// byte[] patata = new byte[]{0x61,0x62,0x63};// byte[] patata1 = new byte[]{0x61,0x62,0x63,0x64,0x62,0x63,0x64,0x65,0x63,0x64,0x65,0x66,0x64,0x65,0x66,0x67,0x65,0x66,0x67,0x68,0x66,0x67,0x68,0x69,0x67,0x68,0x69,0x6a,0x68,0x69,0x6a,0x6b,0x69,0x6a,0x6b,0x6c,0x6a,0x6b,0x6c,0x6d,0x6b,0x6c,0x6d,0x6e,0x6c,0x6d,0x6e,0x6f,0x6d,0x6e,0x6f,0x70,0x6e,0x6f,0x70,0x71};// byte[] patata3 = new byte[1000000];// for (int i = 0; i < patata3.length; i++) {// patata3[i] = 0x61;// }//// System.out.println(patata[0]);//// System.out.println(Byte.valueOf(Integer.toString(patata[0]), 16));//// System.out.println(patata1[0]);// // //Byte b = (byte) 0x80;// //System.out.println(Integer.toHexString(b));// // // //System.out.println(Byte.parseByte(b.toString(), 16));// BigInteger finale = hash(patata3);// //System.out.println(finale);//// int a=45;//// int b=3;//// String f;//// f = Integer.toBinaryString(a);//// int c = NOT(a);//// String h = Integer.toBinaryString(c);//// System.out.println(f);//// System.out.println(h);// // } public static BigInteger hash (byte[] M){ int[] k = new int[]{0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5, 0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174, 0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da, 0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,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}; int[] H = new int[]{0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; int[] W = new int[64]; int a,b,c,d,e,f,g,h; int T1,T2; int bytespadding = padding(M); byte[] sha = new byte[M.length+9+bytespadding]; //copiamos en sha el mensaje entero for (int i = 0; i < M.length; i++) {// sha[i] = Byte.valueOf(Integer.toString(M[i]), 16); sha[i] = M[i]; } //a朼dimos el byte inicial de padding sha[M.length] = (byte) 0x80; //a朼dimos el resto del padding for (int j = 0; j < bytespadding; j++) { sha[M.length+j+1] = (byte) 0x00; } //a朼dimos tama杘 del mensaje long tammsg = (M.length * 8); int tmp = (int)(tammsg >>> 32); sha[M.length+bytespadding+1]=(byte) (tmp>>>24);// sha[M.length+bytespadding+1]=(byte) Integer.parseInt((Integer.toHexString((tmp>>>24)))); sha[M.length+bytespadding+2]=(byte)((tmp>>>16) & 0x00ff);// sha[M.length+bytespadding+2]=(byte) Integer.parseInt((Integer.toHexString(((tmp>>>16) & 0x00ff)))); sha[M.length+bytespadding+3]=(byte)((tmp>>>8) & 0x00ff);// sha[M.length+bytespadding+3]=(byte) Integer.parseInt((Integer.toHexString(((tmp>>>8) & 0x00ff)))); sha[M.length+bytespadding+4]=(byte)((tmp) & 0x00ff);// sha[M.length+bytespadding+4]=(byte) Integer.parseInt((Integer.toHexString(((tmp) & 0x00ff)))); tmp = (int)tammsg; sha[M.length+bytespadding+5]=(byte) (tmp>>>24);// sha[M.length+bytespadding+5]=(byte) Integer.parseInt((Integer.toHexString((tmp>>>24)))); sha[M.length+bytespadding+6]=(byte)((tmp>>>16) & 0x00ff);// sha[M.length+bytespadding+6]=(byte) Integer.parseInt((Integer.toHexString(((tmp>>>16) & 0x00ff)))); sha[M.length+bytespadding+7]=(byte)((tmp>>>8) & 0x00ff);// sha[M.length+bytespadding+7]=(byte) Integer.parseInt((Integer.toHexString(((tmp>>>8) & 0x00ff)))); sha[M.length+bytespadding+8]=((byte)((tmp) & 0x00ff));// sha[M.length+bytespadding+8]=(byte) Integer.parseInt((Integer.toHexString(((tmp) & 0x00ff)))); //En este punto, tenemos en sha todo el mensaje // System.out.println("El tama杘 de todo el mensaje es: "+sha.length); //Ahora tratamos cada palabra de 512 bits por separado for(int i=0;i<sha.length;i=i+64) { int palabra=0; //inicializamos las primeras 16 partes de M for(int j=0;j<64;j= j+4) {// System.out.println(Integer.parseInt((String.valueOf(sha[i+j])+String.valueOf(sha[i+j+1])+String.valueOf(sha[i+j+2])+String.valueOf(sha[i+j+3])))); int word = (int)((sha[i+j] & 0x0ff) << 24)|(int)((sha[i+j+1] & 0x0ff) << 16)|(int)((sha[i+j+2] & 0x0ff) << 8)|(int)((sha[i+j+3] & 0x0ff)); //System.out.println("word: "+Integer.toHexString(word)); W[palabra] = word;// W[palabra] = Integer.parseInt((String.valueOf(sha[i+j])+String.valueOf(sha[i+j+1])+String.valueOf(sha[i+j+2])+String.valueOf(sha[i+j+3]))); palabra++; } //ahora el resto for(int j=16;j<64;j++) { W[j] = o1(W[j-2]) + W[j-7] + o0(W[j-15]) + W[j-16];// System.out.println(o1(W[j-2]));// System.out.println(W[j-7]);// System.out.println(o0(W[j-15]));// System.out.println(Integer.toHexString());// System.out.println("W[16]: "+Integer.toHexString(W[16])); } // System.out.println("W[0]: "+Integer.toHexString(W[0]));// System.out.println("W[16]: "+Integer.toHexString(W[16])); //En este punto ya tengo montado el W a = H[0]; b = H[1]; c = H[2]; d = H[3]; e = H[4]; f = H[5]; g = H[6]; h = H[7]; for(int it=0;it<64;it++) { T1 = h + Sum1(e) + CH(e, f, g) + k[it] + W[it]; T2 = Sum0(a) + Maj(a, b, c); h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2; // System.out.println("----------------"+it+"--------------");// // System.out.println("a: "+Integer.toHexString(a));// System.out.println("b: "+Integer.toHexString(b));// System.out.println("c: "+Integer.toHexString(c));// System.out.println("d: "+Integer.toHexString(d));// System.out.println("e: "+Integer.toHexString(e));// System.out.println("f: "+Integer.toHexString(f));// System.out.println("g: "+Integer.toHexString(g));// System.out.println("h: "+Integer.toHexString(h));// System.out.println("T1: "+Integer.toHexString(T1));// System.out.println("T2: "+Integer.toHexString(T2));// // // System.out.println("---------FIN----"+it+"--------------"); } H[0]+=a; H[1]+=b; H[2]+=c; H[3]+=d; H[4]+=e; H[5]+=f; H[6]+=g; H[7]+=h; }// System.out.println("---------H------------------");// // System.out.println("0: "+Integer.toHexString(H[0]));// System.out.println("1: "+Integer.toHexString(H[1]));// System.out.println("2: "+Integer.toHexString(H[2]));// System.out.println("3: "+Integer.toHexString(H[3]));// System.out.println("4: "+Integer.toHexString(H[4]));// System.out.println("5: "+Integer.toHexString(H[5]));// System.out.println("6: "+Integer.toHexString(H[6]));// System.out.println("7: "+Integer.toHexString(H[7]));// // System.out.println("---------FIN------------------"); //System.out.println("el tama杘 del mensaje es: "+tammsg); //String size = long.toBinaryString(tammsg); // String sizeok = rellenar_ceros(size,64);//System.out.println("sizeok: "+sizeok); //ahora lo pasamos a Hexa // int hexa= Integer.parseInt(sizeok,2);// System.out.println(hexa+" es el valor de hexa"); //String hexString = Integer.toHexString(hexa);// System.out.println(hexString+" es el tama杘 de sizebyte");// System.out.println(Integer.parseInt(hexString,16)); // System.out.println(hexString.length()+" es el tama杘 de string"); //String correcthexString = "0"; //if(hexString.length()%2!=0) //correcthexString+=hexString; //else //correcthexString=hexString; // System.out.println(correcthexString); //int ceros = (8-(correcthexString.length()/2));// System.out.println(ceros+" es numero de ceros"); //rellenamos de ceros lo que no hace falta //for (int z = 0; z < ceros; z++) { //sha[M.length+bytespadding+1+z] = (byte) 0x00; // System.out.println(z); //} //rellenamos las casillas que nos faltan //int n = correcthexString.length()/2; //for (int i = 0; i < n; i++) { // sha[M.length+bytespadding+1+ceros+i] = Byte.valueOf(correcthexString.substring(2*i, 2*i+2)); //} //printeamos la array// mostrar_array(sha); byte sha256[] = new byte[32]; for (int i=0;i<8;i++){ tmp = H[i]; sha256[i*4]=(byte) (tmp>>>24); sha256[i*4+1]=(byte)((tmp>>>16) & 0x00ff); sha256[i*4+2]=(byte)((tmp>>>8) & 0x00ff); sha256[i*4+3]=(byte)((tmp) & 0x00ff); } BigInteger result = new BigInteger(1,sha256); return result; } static String rellenar_ceros(String value,int i){ int j = i-value.length(); String s = "0"; for (int j2 = 0; j2 < j-1; j2++) { s+="0"; } s+=value; return s; } private static int padding (byte[] M){ int bytesM,bytesK; //cogemos los bytes del mensaje bytesM = M.length; //le aplicamos la formula para sabes en bytesK cuantos bytes de ceros necesitamos bytesK = (55- bytesM)%64; //si es menor que 0 lo convertimos en positivo if(bytesK<0) bytesK+=64; //devolvemos el numero de bytes return bytesK; } private static int ShR (int X, int rot){ return X>>>rot; } private static int RotR (int X, int rot){ int Y = X; return (X>>>rot)+(Y<<32-rot); } private static int AND (int a, int b){ return a & b; } private static int XOR (int a, int b){ return a ^ b; } private static int NOT (int a){ return ~a; } private static int CH(int a, int b, int c){ return XOR(AND(a,b),AND(NOT(a),c)); } private static int Maj(int a, int b, int c){ return XOR(XOR(AND(a,b),AND(a,c)),AND(b,c)); } private static int Sum0 (int a){ return XOR(XOR(RotR(a,2),RotR(a,13)),RotR(a,22)); } private static int Sum1 (int a){ return XOR(XOR(RotR(a,6),RotR(a,11)),RotR(a,25)); } private static int o0 (int a){ return XOR(XOR(RotR(a,7),RotR(a,18)),ShR(a,3)); } private static int o1 (int a){ return XOR(XOR(RotR(a,17),RotR(a,19)),ShR(a,10)); } static void mostrar_array(byte[] array){ System.out.println("Iniciamos el printeo de la array"); for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } System.out.println("Finalizamos de printear la array"); }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -