|
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 |
|