/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
eksempel på kryptering?
Fra : Michael Andersen


Dato : 19-09-01 11:32

hejsa
er der nogen der har et eksempel på kryptering, som de eventuelt vil dele?
jeg har rodet med det i et stykke tid og kan ikke få det til at køre. Det
jeg har brug for er kryptering med offentlige/private nøgler.

med venlig hilsen
Michael



 
 
Soren 'Disky' Reinke (19-09-2001)
Kommentar
Fra : Soren 'Disky' Reinke


Dato : 19-09-01 12:06


"Michael Andersen" <mander48@students.aabc.dk> skrev i en
meddelelse news:9o9s75$17lc$1@news.net.uni-c.dk...
> hejsa
> er der nogen der har et eksempel på kryptering, som de
eventuelt vil dele?
> jeg har rodet med det i et stykke tid og kan ikke få det til at
køre. Det
> jeg har brug for er kryptering med offentlige/private nøgler.

Kig på www.javasoft.com

Sun har lavet en API til netop dette, den hedder vist JCE.

--
With many Thanks

Soren ' Disky ' Reinke ICQ #1413069
http://www.disky-design.dk/fish
Remove IHSYD from email address when replying by email



Michael Andersen (19-09-2001)
Kommentar
Fra : Michael Andersen


Dato : 19-09-01 13:50

>
> Kig på www.javasoft.com
>
> Sun har lavet en API til netop dette, den hedder vist JCE.

Det er netop JCE og JCA jeg har rodet med.. (og andre moduler) kan ikke få
det til at køre.. spørger derfor om nogen har et virkende eksempel til at
ligge. Det eneste jeg skal have gjort at kryptere / dekryptere en
tekststreng, udfra offentlige/private nøgler.

mvh Michael



Soren 'Disky' Reinke (19-09-2001)
Kommentar
Fra : Soren 'Disky' Reinke


Dato : 19-09-01 14:02


"Michael Andersen" <mander48@students.aabc.dk> skrev i en
meddelelse news:9oa493$vh6$1@news.net.uni-c.dk...
> >
> > Kig på www.javasoft.com
> >
> > Sun har lavet en API til netop dette, den hedder vist JCE.
>
> Det er netop JCE og JCA jeg har rodet med.. (og andre moduler)
kan ikke få
> det til at køre.. spørger derfor om nogen har et virkende
eksempel til at
> ligge. Det eneste jeg skal have gjort at kryptere / dekryptere
en
> tekststreng, udfra offentlige/private nøgler.
>
Prøv at mail mig (læs nederste signatur linie)

SÅ skal jeg se om jeg kan grave et frem til dig som virker :)

--
With many Thanks

Soren ' Disky ' Reinke ICQ #1413069
http://www.disky-design.dk/fish
Remove IHSYD from email address when replying by email



Peter Lind (19-09-2001)
Kommentar
Fra : Peter Lind


Dato : 19-09-01 17:21


"Michael Andersen" <mander48@students.aabc.dk> wrote

> er der nogen der har et eksempel på kryptering, som de eventuelt vil dele?
> jeg har rodet med det i et stykke tid og kan ikke få det til at køre. Det
> jeg har brug for er kryptering med offentlige/private nøgler.


Hejsa
Jeg bøvlede for et års tid siden med præcis det samme, og fik det aldrig til
at virke med SUNs JCE.
Det gik derimod meget bedre med openJCE - det plejede at ligge på
www.openjce.org, men siden svarer slet ikke for mig - nogle andre ???

Jeg importerer au.net.aba.crypto.provider.*; som var navnet på den tidlige
version af openjce jeg brugte - jeg ved ikke om der findes en
nyere/bedre/anden.

Det lykkedes mig aldrig at få disse kodeeksempler til at køre med Suns JCE -
altid fik jeg no such algorithm.

Men her følger tre java-filer, en til at generere et nøglesæt, en til at
kryptere en fil, og en til at dekryptere...
Jeg synes selv de er usædvanlig godt dokumenterede, men sig til hvis der er
spørgsmål

mvh
Peter Lind

----GenerateKeys.java----

import java.io.*;
import java.security.*;
import java.security.spec.*;
import java.security.interfaces.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import javax.crypto.interfaces.*;
import au.net.aba.crypto.provider.*;

/**
* GenerateKeys is used for generating keys for encrypting or signing
datafiles.
* It always generates a set of keys, a public and a private.
* It can be used as a standalone application, or as a class from other
applications.
*
* A typical usage-pattern is as follows:
* 1) construct a GenerateKeys object
* 2) use generate to generate the keyset
* 3) use savePublic to save the public key to an encoded file
* 4) use savePrivate to save the private key to an encoded file
*
*
* @author Peter Lind
* @version 1.0 - 15. august 2000
*/
public class GenerateKeys
{
private PrivateKey privateKey;
private PublicKey publicKey;

private KeyPairGenerator keygenerator;


/**
* Default constructor
*
*/
public GenerateKeys( )
{

}


/**
* Generate a set of keys.
*
*/
public void generate() throws NoSuchAlgorithmException
{
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");

keygenerator = new RSAKeyPairGenerator();
keygenerator.initialize( 1024, random );

KeyPair pair = keygenerator.generateKeyPair();
privateKey = pair.getPrivate();
publicKey = pair.getPublic();
}


/**
* Saves the encoded private key to a given file.
*
*/
public void savePrivate( FileOutputStream privatefile ) throws IOException
{
byte[] keyv = privateKey.getEncoded();
privatefile.write(keyv);
privatefile.close();

}


/**
* Saves the encoded public key to a given file.
*
*/
public void savePublic( FileOutputStream publicfile ) throws IOException
{
byte[] key = publicKey.getEncoded();
publicfile.write(key);
publicfile.close();
}


/**
* For application use
*
* Call the application as:
* Generatekeys 'type' publickeyfile privatekeyfile
*
* where 'type' is crypto or signature
*
*/
public static void main(String[] args)
{
if (args.length != 2)
{
System.out.println("Usage: Generatekeys publicfile privatefile");
}
else try
{
GenerateKeys generator = new GenerateKeys( );
generator.generate( );
generator.savePublic( new FileOutputStream(args[1]) );
generator.savePrivate( new FileOutputStream(args[2]) );

}
catch (Exception e)
{
System.err.println("Caught exception " + e.toString());
}
}

}

----Encrypt.java----
import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import au.net.aba.crypto.provider.*;

/**
* Encrypt is used for encrypting files.
* It can be used as a standalone application, or as a class from other
applications.
*
* A typical usage-pattern is as follows:
* 1) construct an Encrypt object
* 2) use loadKey to load the public encryption key
* 3) use loadData to load the (plaintext) data to be encrypted
* 4) use encrypt to encrypt the data
* 5) use saveData to save the encrypted (cipher) data
*
*
* @author Peter Lind
* @version 1.0 - 15. august 2000
*/
public class Encrypt
{
private PublicKey publicKey;
private byte[] plainText;
private byte[] cipherText;


/**
* Default constructor.
*
*/
public Encrypt( )
{
Security.addProvider(new ABAProvider());
}


/**
* Loads the encoded key from a file and creates a publicKey object.
*
*/
public void loadKey( FileInputStream keyFile ) throws IOException,
InvalidKeySpecException
{
// read the public key from file
byte[] encodedKey = new byte[keyFile.available()];
keyFile.read(encodedKey);
keyFile.close();

// Convert the encoded key (in X509 format) to a real keyobject
X509EncodedKeySpec codedKey = new X509EncodedKeySpec( encodedKey );
try
{
KeyFactory keyfactory = KeyFactory.getInstance("RSA");
publicKey = keyfactory.generatePublic( codedKey );
}
catch( java.security.NoSuchAlgorithmException nsaEx )
{
System.out.println("Internal Error - Encrypt - loadkey, RSA unknown
");
}
}


/**
* Loads a plaintext file as a bytestream.
*
*/
public void loadData( FileInputStream plainFile) throws IOException,
InvalidKeyException
{
plainText = new byte[plainFile.available()];
plainFile.read(plainText);
plainFile.close();
}


public byte[] getData()
{
return cipherText;
}


/**
* Saves the encrypted cipher bytestream to a file.
*
*/
public void saveData( File cipherFile ) throws IOException
{
saveData( new FileOutputStream( cipherFile ) );
}



public void saveData( FileOutputStream cipherFile ) throws IOException
{
cipherFile.write(cipherText);
cipherFile.close();
}


/**
* Encrypts the loaded data with the loaded key.
*
*/
public void encrypt() throws InvalidKeyException,
IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException
{
// Setup cipher object
try
{
Cipher coding = Cipher.getInstance("RSA/ECB/PKCS1Padding");

// encrypt cipher with the public key
coding.init(Cipher.ENCRYPT_MODE, publicKey);

cipherText = coding.doFinal( plainText );
}
catch( NoSuchAlgorithmException nsaEx )
{
System.out.println("Internal Error - no such algorithm:
RSA/ECB/PKCS1Padding ");
}


}


/**
* For application use
*
* Call the application as:
* Encrypt datafile keyfile destination
*
*/
public static void main(String[] args)
{
/* Encrypt a file using the public key */
if (args.length != 3)
{
System.out.println("Usage: Encrypt datafile keyfile destination");
}
else try
{
Encrypt crypter = new Encrypt();
crypter.loadKey( new FileInputStream(args[1]) );
crypter.loadData( new FileInputStream(args[0]) );
crypter.encrypt();
crypter.saveData( new FileOutputStream(args[2]) );
}
catch (Exception e)
{
System.err.println("Caught exception " + e.toString());
}
}

}

----Decrypt.java----
import java.io.*;
import java.security.*;
import java.security.spec.*;
import javax.crypto.*;
import au.net.aba.crypto.provider.*;

/**
* Decrypt is used for decrypting files encrypted with Encrypt.
* It can be used as a standalone application, or as a class from other
applications.
*
* A typical usage-pattern is as follows:
* 1) construct a Decrypt object
* 2) use loadKey to load the private decryption key
* 3) use loadCipher to load the encrypted data
* 4) use decrypt to decrypt the data
* 5) use saveData to save the decrypted (plaintext) data
*
*
* @author Peter Lind
* @version 1.0 - 15. august 2000
*/
public class Decrypt
{
private PrivateKey privateKey; // the key for decryption
private byte[] cipherText; // the encrypted data
private byte[] plainText; // the decrypted data


/**
* Default constructor.
*
*/
public Decrypt( )
{
Security.addProvider(new ABAProvider());
}

/**
* Loads the encoded key from a file and creates a privateKey object.
*
*/
public void loadKey( FileInputStream keyFile ) throws IOException,
InvalidKeySpecException
{
// read the private key from file
byte[] encodedKey = new byte[keyFile.available()];
keyFile.read(encodedKey);
keyFile.close();

PKCS8EncodedKeySpec codedKey = new PKCS8EncodedKeySpec( encodedKey );
try
{
KeyFactory keyfactory = KeyFactory.getInstance("RSA");
privateKey = keyfactory.generatePrivate( codedKey );
}
catch ( java.security.NoSuchAlgorithmException nsaEx )
{
System.out.println("Internal Error - NSA RSA decrypt - loadkey ");
}
// now the privateKey contains a real private key !
}



/**
* Loads an encrypted file as a bytestream, and turns it into a cipher
object.
*
*/
public void loadCipher( FileInputStream cipherFile) throws IOException
{
cipherText = new byte[cipherFile.available()];
cipherFile.read(cipherText);
cipherFile.close();
}

public void setCipher( byte[] cipherbytes)
{
cipherText = cipherbytes;
}


public byte[] getData( )
{
return plainText;
}


/**
* Saves the decrypted plaintext bytestream to a file.
*
*/
public void saveData( File plainFile ) throws IOException
{
saveData( new FileOutputStream( plainFile ));
}


public void saveData( FileOutputStream plainFile ) throws IOException
{
plainFile.write(plainText);
plainFile.close();
}


/**
* Decrypts the loaded data with the loaded key.
*
*/
public void decrypt() throws InvalidKeyException,
IllegalBlockSizeException, BadPaddingException
{
// Setup cipher object
try
{
Cipher coding = Cipher.getInstance("RSA/ECB/PKCS1Padding");

// decrypt cipher with the private key
coding.init(Cipher.DECRYPT_MODE, privateKey);

plainText = coding.doFinal( cipherText );
}
catch ( java.security.NoSuchAlgorithmException nsaEx )
{
System.out.println("Internal Error - NSA decrypt ");
}
catch ( javax.crypto.NoSuchPaddingException nspEx )
{
System.out.println("Internal Error - No Such Padding decrypt ");
}
}




/**
* For application use.
*
* Call the application as:
* Decrypt datafile keyfile destination
*
*/
public static void main(String[] args)
{
/* Decrypt a file using the private key */
if (args.length != 3)
{
System.out.println("Usage: Decrypt datafile keyfile destination");
}
else try
{
Decrypt decrypter = new Decrypt();
decrypter.loadKey( new FileInputStream(args[1]) );
decrypter.loadCipher( new FileInputStream(args[0]) );
decrypter.decrypt();
decrypter.saveData( new FileOutputStream(args[2]) );
}
catch (Exception e)
{
System.err.println("Caught exception " + e.toString());
}
}

}





Michael Andersen (28-09-2001)
Kommentar
Fra : Michael Andersen


Dato : 28-09-01 12:40

Alletiders! 1000 tak for det Peter!
det virker bare som det skal, og jeg har lavet det om så klasserne nu er
mere generelle (tager byte[] med som jeg henter fra db)
kryptering og dekryptering kører bare!

Eneste lille "men" er at jeg også gerne vil signere/kontrollere signaturer,
og her støder jeg så igen på en fejl:
"java.security.NoSuchAlgorithmException: RSA Signature not available"


"Peter Lind" wrote :
> Det gik derimod meget bedre med openJCE - det plejede at ligge på
> www.openjce.org, men siden svarer slet ikke for mig - nogle andre ???
>

Den svarer heller ikke for mig.. men det har den gjort, da jeg mener det var
der jeg hentede pakken.

> Jeg importerer au.net.aba.crypto.provider.*; som var navnet på den tidlige
> version af openjce jeg brugte - jeg ved ikke om der findes en
> nyere/bedre/anden.

den bruger jeg også, men jeg ved så ikke om den har algoritme til signering
med RSA nøgler.

Jeg benytter altså den provider men får fejlen om at "RSA Signature not
available".
Ved du / nogen om denne er med i pakken, eller man skal ud og finde en ny
provider
kun til at signere med ?

Jeg har inkluderet den metode jeg bruger til at signere (som giver fejlen)

mvh Michael



public static byte[] signerstreng( byte[] nøgle, String inputstr ) throws
InvalidKeySpecException {
/*
* pre: nøgle indeholder en privatekey i encoded form
*
*/
try{
Security.addProvider(new ABAProvider());

// lav den kodede nøgle om til et PrivateKey objekt
System.out.println("decoding key..");
PrivateKey privateKey = null;
PKCS8EncodedKeySpec codedKey = new PKCS8EncodedKeySpec( nøgle );
try {
KeyFactory keyfactory = KeyFactory.getInstance("RSA");
privateKey = keyfactory.generatePrivate( codedKey );
} catch ( java.security.NoSuchAlgorithmException nsaEx ){
System.out.println("Internal Error - NSA RSA decrypt - loadkey ");
}
System.out.println("decoding complete..");

System.out.println( "Vil nu signere strengen:" + inputstr );
// lav et signatur objekt:
Signature dsa = Signature.getInstance("DSA");

// intialiser den med privatekey
dsa.initSign(privateKey);

// lav noget data og put i et byte array
byte[] data = inputstr.getBytes();

// læg data ind i signatur objektet og signer det.
dsa.update(data);
byte[] sig = dsa.sign();

System.out.println( "data signeret med privatnøgle" );
return sig;

} catch ( Exception e ){
System.out.println("Error: " + e);
};
return null;

}





Michael Andersen (28-09-2001)
Kommentar
Fra : Michael Andersen


Dato : 28-09-01 12:48

> // lav et signatur objekt:
> Signature dsa = Signature.getInstance("DSA");
>
er naturligvis
// lav et signatur objekt:
Signature dsa = Signature.getInstance("RSA");

prøvede med DSA og andre algoritme navne som test. (gav fejlen: "Error:
java.security.InvalidKeyException: not a DSA private key: com.sun.rsajca.
JSA_RSAPrivateKey@6a9d42" )

-Michael




Michael Andersen (28-09-2001)
Kommentar
Fra : Michael Andersen


Dato : 28-09-01 13:46

fandt noget:
"In the case of RSA, there are multiple choices for the message digest
algorithm, so the signing algorithm could be specified as, for example,
MD2withRSA, MD5withRSA, or SHA1withRSA. The algorithm name must be
specified, as there is no default. "

bruger nu:
Signature dsa = Signature.getInstance("MD5withRSA");

og virker bare nu :))
eneste problem jeg har er at den "signature" man får ud er i form at et
byte[] og er derfor lidt svær at sende med i en mail. Kan selvfølgelig lave
den til en fil og vedhæfte den, men jeg ville nu foretrække at kunne lave en
string repræsentation af den. Er der nogen der ved om dette kan lade sig
gøre ??

mvh Michael




Soren 'Disky' Reinke (28-09-2001)
Kommentar
Fra : Soren 'Disky' Reinke


Dato : 28-09-01 14:09


"Michael Andersen" <mander48@students.aabc.dk> skrev i en
meddelelse news:9p1red$14bs$1@news.net.uni-c.dk...
> fandt noget:
> "In the case of RSA, there are multiple choices for the message
digest
> algorithm, so the signing algorithm could be specified as, for
example,
> MD2withRSA, MD5withRSA, or SHA1withRSA. The algorithm name must
be
> specified, as there is no default. "
>
> bruger nu:
> Signature dsa = Signature.getInstance("MD5withRSA");
>
> og virker bare nu :))
> eneste problem jeg har er at den "signature" man får ud er i
form at et
> byte[] og er derfor lidt svær at sende med i en mail. Kan
selvfølgelig lave
> den til en fil og vedhæfte den, men jeg ville nu foretrække at
kunne lave en
> string repræsentation af den. Er der nogen der ved om dette kan
lade sig
> gøre ??

String signatur=new String(ditNyteArray);

--
With many Thanks

Soren ' Disky ' Reinke ICQ #1413069
http://www.disky-design.dk/fish
Remove IHSYD from email address when replying by email



Peter Lind (28-09-2001)
Kommentar
Fra : Peter Lind


Dato : 28-09-01 18:02


"Michael Andersen" <mander48@students.aabc.dk> wrote in message
news:9p1red$14bs$1@news.net.uni-c.dk...
[ snip ]
> eneste problem jeg har er at den "signature" man får ud er i form at et
> byte[] og er derfor lidt svær at sende med i en mail. Kan selvfølgelig
lave
> den til en fil og vedhæfte den, men jeg ville nu foretrække at kunne lave
en
> string repræsentation af den. Er der nogen der ved om dette kan lade sig
> gøre ??

Well, jeg brugte i sin tid krypteringen i forbindelse med XML dokumenter,
hvor signatures skulle ligge læseligt i selve XML-dokumentet. Istedet for at
bruge alle mulige sindrige kodningssystemer konverterede jeg blot byte[]
arrayet til et stort hex-tal og tilbage igen med følgende to små funktioner.
Det virker fint for mig, men der er sikkert mere indviklede måder at gøre
det på... Det er iøvrigt meget længe siden jeg har lavet vedlagte
programmer, der er sikkert smartere måder at konvertere til og fra hex...

mvh
Peter Lind
-el krypto maestro

/**
* converts a string of hexvalues into an array of bytes.
*
*/
private byte[] hexstringtobytes( String hexstring )
{
byte[] retval = new byte[(hexstring.length()/2)];
for( int a=0; a< hexstring.length()-1; a+=2 )
{
int hi = hexstring.charAt(a) - 0x30;
int lo = hexstring.charAt(a+1) - 0x30;
if(hi >9) hi-=7;
if(lo >9) lo-=7;
hi = hi*16 + lo;
retval[(a/2)] = (byte)hi;
}
return retval;
}


private String bytestohexstring( byte[] bytes )
{
String retstring = new String();
for( int a=0; a< bytes.length; a++)
{
int lo = 0x30 + (bytes[a]&0x0f);
if(lo>0x39) lo+=7;
int hi = 0x30 + ((bytes[a]&0xf0)>>4);
if(hi>0x39) hi+=7;
retstring = retstring + (char)hi + (char)lo;
}
return retstring;
}





Michael Andersen (01-10-2001)
Kommentar
Fra : Michael Andersen


Dato : 01-10-01 14:02

Peter Lind wrote
> Well, jeg brugte i sin tid krypteringen i forbindelse med XML dokumenter,
> hvor signatures skulle ligge læseligt i selve XML-dokumentet. Istedet for
at
> bruge alle mulige sindrige kodningssystemer konverterede jeg blot byte[]
> arrayet til et stort hex-tal og tilbage igen med følgende to små
funktioner.
> Det virker fint for mig, men der er sikkert mere indviklede måder at gøre
> det på... Det er iøvrigt meget længe siden jeg har lavet vedlagte
> programmer, der er sikkert smartere måder at konvertere til og fra hex...
>
> mvh
> Peter Lind
> -el krypto maestro

Du er i sandhed "el krypto maestro" :))
endnu engang har du løst et problem som bare ikke ville forsvinde! Ved ikke
om der er smartere måder, men det er egentlig også ligemeget når de
funktioner du har lavet virker. Jeg bruger også signaturen i XML som du
gjorde og det kører bare.

Jeg har nu en færdig klasse "Sikkerhedsmodul" som laver
nøgler/krypterer/dekrypter/signerer/kontrollerer signatur osv. Har sparet en
del grå hår ved at spørge her.. så tak for det allesammen :)

med venlig hilsen
Michael Andersen



Peter Thomsen (26-09-2001)
Kommentar
Fra : Peter Thomsen


Dato : 26-09-01 21:41


Michael Andersen <mander48@students.aabc.dk> skrev i en
nyhedsmeddelelse:9o9s75$17lc$1@news.net.uni-c.dk...
> hejsa
> er der nogen der har et eksempel på kryptering, som de eventuelt vil dele?
> jeg har rodet med det i et stykke tid og kan ikke få det til at køre. Det
> jeg har brug for er kryptering med offentlige/private nøgler.
>
> med venlig hilsen
> Michael
>

En anden mulighed i stedet for JCE er fra IBM's AlphaWorks.
www.alphaworks.com
Mener den hedder noget med CryptoBean

Har ikke brugt den, men IBM plejer at være ret gode til at dokumentere hvad
de laver.

MVH
Peter



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408527
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste