|
KeyManager |
|
/* * KeyManager - Tim Tyler 2001. * * KeyManager - hash a passphrase to produce a key... * * This code has been placed in the public domain. * You can do what you like with it. * Note that this code comes with no warranty. * */ /* * ToDo * ==== * */ import java.security.MessageDigest; class KeyManager { int size_of_key; Block key_block; void setUpKeyConstants(Block iv) { key_block = new Block(size_of_key); for (int i = 0; i < size_of_key; i = i + 2) { key_block.data[i] = (byte)0xC7; key_block.data[i + 1] = (byte)0x38; } // add in IV... for (int i = 0; i < 16; i++) { key_block.data[i] = iv.data[i]; } key_block.data[0] |= 1; // make sure the result is an odd number... } byte[] getKeyByteArray(String s) { byte[] ba; byte[] temp; byte[] digest; MessageDigest md; if (size_of_key == 0) { digest = getHexKey(s); if (size_of_key != 0) { return digest; } size_of_key = 32; } digest = getHashKey(s); return digest; } byte[] getHashKey(String s) { byte[] ba; byte[] temp; byte[] digest; MessageDigest md; digest = new byte[size_of_key]; try { ba = stringToByteArray(s); md = MessageDigest.getInstance("SHA"); md.update(ba); temp = md.digest(); System.arraycopy(temp,0,digest,0,16); if (size_of_key > 16) { md.update(new byte[1]); // a single extra 00 byte... temp = md.digest(); System.arraycopy(temp, 0, digest, 16, size_of_key - 16); } } catch (Exception e) { Log.log("Error while getting key:"); e.printStackTrace(Log.getPrintStream()); } return digest; } byte[] getHexKey(String s) { byte[] key = new byte[48]; byte[] key2 = new byte[48]; int val; String byte_str; int index = 0; int len = s.length(); size_of_key = 0; try { if (s.charAt(0) == '0') { if (s.charAt(1) == 'x') { for (index = 2; index < len; index += 2) { byte_str = "" + s.charAt(index) + s.charAt(index + 1); val = Integer.parseInt(byte_str,16); key[((index - 2) >>> 1)] = (byte)val; } } } } catch (Exception e) { // silence... // Log.log("Problems parsing hex key..."); // e.printStackTrace(Log.getPrintStream()); } index = (index - 2) >>> 1; if ((index == 16) || (index == 24) || (index == 32)) { // Log.log("HEX KEY:"); size_of_key = index; key2 = new byte[size_of_key]; System.arraycopy(key, 0, key2, 0, size_of_key); // copy a block across... return key2; } return null; } int getKeySize() { return size_of_key; } int getBestBlockSize() { return (size_of_key == 16) ? 16 : 32; } byte[] stringToByteArray(String s) { int len = s.length(); byte[] ba = new byte[len]; for (int i = 0; i < len; i++ ) { ba[i] = (byte)(s.charAt(i)); } return ba; } String appendByteArrayToString(String s, byte[] b) { StringBuffer sb = new StringBuffer(s); int len = b.length; byte[] ba = new byte[len]; for (int i = 0; i < len; i++ ) { sb.append((char)b[i]); } return sb.toString(); } public static void main(String args[]) { BIAESFrEnd.main(args); } }
|
KeyManager |
|