175 votes

Comment chiffrer String en Java

Ce dont j'ai besoin est de chiffrer la chaîne qui apparaîtront dans les codes à barres 2D (PDF-417) donc, quand quelqu'un se faire une idée de l'analyser obtiendrez rien de lisible.

D'autres exigences sont - qui ne devrait pas être compliqué, il ne comprendrait pas de RSA, PKI infrstructure, des paires de clés etc. Il doit être assez simple de se débarrasser de la snooping gens arround, et facile à déchiffrer pour les autres entreprises interresse dans l'obtention de ces données. Ils nous appellent, nous leur disons de la norme ou de leur donner quelques clés simples qui peuvent être utilisées pour le décryptage.

Sans doute, les entreprises pourraient utiliser des technologies différentes, de sorte qu'il serait bon de s'en tenir à quelques standard qui n'est pas liée à certaines plate-forme spéciale ou de la technologie.

Que proposez-vous? Est-il une classe java faire encrypt() décrypter() sans trop de complication dans la réalisation des normes de sécurité élevées ?

110voto

VoidPointer Points 7260

Je vous recommande d'utiliser un standard symétrique monogramme qui est largement disponibles comme DES, 3DES ou AES. Alors que ce n'est pas l'algorithme le plus sécurisé, il y a des tas de mises en œuvre et vous avez juste besoin de donner les clés à quelqu'un qui est censé décrypter les informations contenues dans le code à barres. javax.crypto.Cipher est ce que vous voulez travailler ici.

Supposons que les octets à chiffrer sont dans

byte[] input;

Ensuite, vous aurez besoin de la clé et le vecteur d'initialisation octets

byte[] keyBytes;
byte[] ivBytes;

Maintenant, vous pouvez initialiser l'algorithme de Chiffrement pour l'algorithme que vous sélectionnez:

// wrap key data in Key/IV specs to pass to cipher
SecretKeySpec key = new SecretKeySpec(keyBytes, "DES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
// create the cipher with the algorithm you choose
// see javadoc for Cipher class for more info, e.g.
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

Le cryptage ne se passent ainsi:

cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
byte[] encrypted= new byte[cipher.getOutputSize(input.length)];
int enc_len = cipher.update(input, 0, input.length, encrypted, 0);
enc_len += cipher.doFinal(encrypted, enc_len);

Et le déchiffrement comme ceci:

cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
byte[] decrypted = new byte[cipher.getOutputSize(enc_len)];
int dec_len = cipher.update(encrypted, 0, enc_len, decrypted, 0);
dec_len += cipher.doFinal(decrypted, dec_len);

13voto

sherif Points 1666

merci ive fait cette classe en utilisant votre code peut-être que quelqu'un le trouve userfull

cryptage d'objet

 import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class ObjectCrypter {

private Cipher deCipher;
private Cipher enCipher;
private SecretKeySpec key;
private IvParameterSpec ivSpec;


public ObjectCrypter(byte[] keyBytes,   byte[] ivBytes) {
    // wrap key data in Key/IV specs to pass to cipher


     ivSpec = new IvParameterSpec(ivBytes);
    // create the cipher with the algorithm you choose
    // see javadoc for Cipher class for more info, e.g.
    try {
         DESKeySpec dkey = new  DESKeySpec(keyBytes);
          key = new SecretKeySpec(dkey.getKey(), "DES");
         deCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
         enCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public byte[] encrypt(Object obj) throws InvalidKeyException, InvalidAlgorithmParameterException, IOException, IllegalBlockSizeException, ShortBufferException, BadPaddingException {
    byte[] input = convertToByteArray(obj);
    enCipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);

    return enCipher.doFinal(input);




//  cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
//  byte[] encypted = new byte[cipher.getOutputSize(input.length)];
//  int enc_len = cipher.update(input, 0, input.length, encypted, 0);
//  enc_len += cipher.doFinal(encypted, enc_len);
//  return encypted;


}
public Object decrypt( byte[]  encrypted) throws InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, IOException, ClassNotFoundException {
    deCipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

    return convertFromByteArray(deCipher.doFinal(encrypted));

}



private Object convertFromByteArray(byte[] byteObject) throws IOException,
        ClassNotFoundException {
    ByteArrayInputStream bais;

    ObjectInputStream in;
    bais = new ByteArrayInputStream(byteObject);
    in = new ObjectInputStream(bais);
    Object o = in.readObject();
    in.close();
    return o;

}



private byte[] convertToByteArray(Object complexObject) throws IOException {
    ByteArrayOutputStream baos;

    ObjectOutputStream out;

    baos = new ByteArrayOutputStream();

    out = new ObjectOutputStream(baos);

    out.writeObject(complexObject);

    out.close();

    return baos.toByteArray();

}


}
 

11voto

ante.sabo Points 763

ok, voici le code que je vais utiliser. S'il vous plaît aviser si vous estimez que cela ne va pas pour une raison quelconque. J'utilise le Base64Encoder / Decoder de Sun, qui se trouve dans le JRE de Sun, pour éviter encore un autre JAR dans lib. C'est dangereux d'utiliser OpenJDK ou le JRE d'un autre. Outre cela, y a-t-il une autre raison pour laquelle je devrais envisager d'utiliser Apache commons lib avec Encoder / Decoder?

 public class EncryptUtils {
   public static final String DEFAULT_ENCODING="UTF-8"; 
   static BASE64Encoder enc=new BASE64Encoder();
   static BASE64Decoder dec=new BASE64Decoder();

   public static String base64encode(String text){
      try {
         String rez = enc.encode( text.getBytes( DEFAULT_ENCODING ) );
         return rez;         
      }
      catch ( UnsupportedEncodingException e ) {
         return null;
      }
   }//base64encode

   public static String base64decode(String text){

         try {
            return new String(dec.decodeBuffer( text ),DEFAULT_ENCODING);
         }
         catch ( IOException e ) {
           return null;
         }

      }//base64decode

      public static void main(String[] args){
       String txt="some text to be encrypted" ;
       String key="key phrase used for XOR-ing";
       System.out.println(txt+" XOR-ed to: "+(txt=xorMessage( txt, key )));
       String encoded=base64encode( txt );       
       System.out.println( " is encoded to: "+encoded+" and that is decoding to: "+ (txt=base64decode( encoded )));
       System.out.print( "XOR-ing back to original: "+xorMessage( txt, key ) );

      }

      public static String xorMessage(String message, String key){
       try {
          if (message==null || key==null ) return null;

         char[] keys=key.toCharArray();
         char[] mesg=message.toCharArray();

         int ml=mesg.length;
         int kl=keys.length;
         char[] newmsg=new char[ml];

         for (int i=0; i<ml; i++){
            newmsg[i]=(char)(mesg[i]^keys[i%kl]);
         }//for i
         mesg=null; keys=null;
         return new String(newmsg);
      }
      catch ( Exception e ) {
         return null;
       }  
      }//xorMessage

}//class
 

5voto

yegor256 Points 21737

Que dis-tu de ça:

 private static byte[] xor(final byte[] input, final byte[] secret) {
    final byte[] output = new byte[input.length];
    if (secret.length == 0) {
        throw new IllegalArgumentException("empty security key");
    }
    int spos = 0;
    for (int pos = 0; pos < input.length; ++pos) {
        output[pos] = (byte) (input[pos] ^ secret[spos]);
        ++spos;
        if (spos >= secret.length) {
            spos = 0;
        }
    }
    return output;
}
 

Fonctionne bien pour moi et est plutôt compact.

3voto

Jeremy Powell Points 1840

Les chiffrements affines semblent assez puissants pour dissuader un pirate informatique occasionnel, mais assez simples pour être mis en œuvre.

http://en.wikipedia.org/wiki/Affine_cipher

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X