Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations derfloh on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Almost finished it!!!

Status
Not open for further replies.

relisys

Programmer
Mar 6, 2003
65
GB
OK so i've fixed the errors with encryption i had in the last thread. I'll put solutions in later in case anyone finds it useful sometime in the future.

Final question on this subject..... promise!

I *CAN* create a key and convert the key to a byte array, then convert the array to a string(base 64):

KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
key = generator.generateKey();
byte[] keyBytes = key.getEncoded;
BASE64Encoder encoder = new BASE64Encoder();
String randomKey = encoder.encode(keyBytes);

and I *CAN* save that string to a database, forget about it, then sometime later reload it and convert it to a byte array again:

String loadedKey = "WhAt3Ver-It-I5" //from DB
BASE64Decoder decoder = new BASE64Decoder();
byte[] loadedKeyBytes = decoder.decodeBuffer(loadedKey);

what I *CAN'T* do is convert the loadedKeyBytes back into the key of the same type as it was originally, enabling me to decrypt whatever that key originally encrypted.

Does anyone know.

I know I need to convert it to a KeySpec, I presume as:


DESKeySpec keySpec = new DESKeySpec(loadedKeyBytes);

this compiles correctly.... but how do i then recreate the key so i can use it for decryption.

Sorry I've had so many questions on this - just call me a cryptographic failure! Once my test program is complete I'll port it to the full program - FINALLY!



================ CODE FOLLOWS ======================
import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import com.sun.crypto.provider.SunJCE;
import sun.misc.*;

public class SecPrescrip {

public static void main(String[] args) throws Exception {

// Create Key.
Key key;

KeyGenerator generator = KeyGenerator.getInstance("DES");
generator.init(new SecureRandom());
key = generator.generateKey();

// Get a cipher object

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

// Encrypt the input string:

cipher.init(Cipher.ENCRYPT_MODE, key);
String input = "Medicare Secure Prescription: 30 Tamazopan 200mg tablets. Dosage: 1 to be taken every 4 hours";

System.out.println("Stage 1: ENCRYPT PRESCRIPTION WITH A RANDOM DES KEY");
System.out.println("===================================================");
System.out.println(" - Input Plain Text: "+input);
System.out.println("");
byte[] stringBytes = input.getBytes("UTF8");
byte[] raw = cipher.doFinal(stringBytes);
BASE64Encoder encoder = new BASE64Encoder();

String ciphertext1 = encoder.encode(raw);
System.out.println(" - Cipher Text: "+ciphertext1);
System.out.println("");

byte[] keybytes = key.getEncoded();
String randomkey = encoder.encode(keybytes);

System.out.println(" - Random Prescription Key: "+randomkey);
System.out.println("");
System.out.println("ENCRYPTION SUCESSFULL");
System.out.println("");
System.out.println("");
System.out.println("Stage 2: ENCRYPT RANDOM KEY WITH PATIENT MEDICARE KEY");
System.out.println("=====================================================");

BASE64Decoder decoder = new BASE64Decoder();

String passphrase = "ABCD1234efghIJ56"; //Patient Medicare Key

System.out.println(" - Patient Medicare Key: "+passphrase);
System.out.println("");
System.out.println(" - Input Plain Text: "+randomkey);


String algorithm = "PBEWithMD5AndDES";
byte[] salt = new byte[8];
int iteration = 20;

KeySpec ks = new PBEKeySpec(passphrase.toCharArray());
SecretKeyFactory skf = SecretKeyFactory.getInstance(algorithm);
SecretKey key2 = skf.generateSecret(ks);

byte[] input2 = decoder.decodeBuffer(randomkey);

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(passphrase.getBytes());
md.update(input2);
byte[] digest = md.digest();
System.arraycopy(digest, 0, salt, 0, 8);

AlgorithmParameterSpec aps = new PBEParameterSpec(salt, iteration);
cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, key2, aps);
byte[] outputFinalKey = cipher.doFinal(input2);
String ciphertext2 = encoder.encode(outputFinalKey);
String saltString = encoder.encode(salt);
String encryptedCiphertext = saltString+ciphertext2;
System.out.println("");
System.out.println(" - Cipher Text (Final Prescription Key): "+ciphertext2);
System.out.println("");
System.out.println(" - Salt: "+saltString);
System.out.println("");
System.out.println(" - Full Encrypted Output: "+encryptedCiphertext);
System.out.println("");
System.out.println("ENCRYPTION SUCESSFULL");
System.out.println("");
System.out.println("");
System.out.println("Stage 3: DECRYPT PRESCRIPTION KEY USING PATIENT MEDICARE KEY");
System.out.println("============================================================");

//NOT CHANGED String passphrase = "ABCD1234efghIJ56";
System.out.println(" - Patient Medicare Key: "+passphrase);
System.out.println("");
System.out.println(" - Input Plain Text: "+ciphertext2);

algorithm = "PBEWithMD5AndDES";
salt = new byte[8];
iteration = 20;

ks = new PBEKeySpec(passphrase.toCharArray());
skf = SecretKeyFactory.getInstance(algorithm);
SecretKey key3 = skf.generateSecret(ks);

//Load in the input bytes as if they had been loaded from an sql database or the like

String saltIn = encryptedCiphertext.substring(0,12);
String ciphertext3 = encryptedCiphertext.substring(12,encryptedCiphertext.length());

byte[] saltArray = decoder.decodeBuffer(saltIn);
byte[] ciphertextarray = decoder.decodeBuffer(ciphertext3);


aps = new PBEParameterSpec(saltArray, iteration);
cipher = Cipher.getInstance(algorithm);

cipher.init(Cipher.DECRYPT_MODE, key3, aps);
byte[] outputKey2 = cipher.doFinal(ciphertextarray);
String plaintext2 = encoder.encode(outputKey2);

System.out.println(" - Plain Text (Random Generated Key): "+plaintext2);
System.out.println("");
System.out.println("");
System.out.println("ENCRYPTION SUCESSFULL");
System.out.println("");
System.out.println("");
System.out.println("Stage 4: DECRYPT PRESCRIPTION KEY USING PATIENT MEDICARE KEY");
System.out.println("============================================================");

// The decrypter string plaintext should be the same as the BASE64 Encoded representation of the random DES string
byte[] randomKeyFetched = decoder.decodeBuffer(plaintext2);

generator = KeyGenerator.getInstance("DES");

DESKeySpec keyspec = new DESKeySpec(randomKeyFetched);

/**
* Stuck here! Once the key is reformed it will be complete!
**/



}
}
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top