web-dev-qa-db-fra.com

Cryptage Android

Je travaille sur une application Android et je dois utiliser le chiffrement pour un aspect de celle-ci. Je suis vraiment indifférent à l'algorithme que j'utilise (AES, DES, RSA, etc ...). Je suis conscient que Java a un paquet crypto, mais je ne le connais pas du tout. Quelqu'un peut-il poster un exemple sur la façon de faire une fonction de chiffrement/déchiffrement?

27

La bibliothèque Java AES contient une faille qui permet, dans les bonnes circonstances, à un auditeur de déchiffrer les paquets envoyés. Voir Padding Oracle Exploit Tool vs Apache MyFaces

Cela étant dit, consultez cette question SO Encryptage AES 256 bits Java .

Bouncy Castle AES EXAMPLE volé à: http://www.Java2s.com/Code/Java/Security/EncryptionanddecryptionwithAESECBPKCS7Padding.htm

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class MainClass {
  public static void main(String[] args) throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());    
    byte[] input = "www.Java2s.com".getBytes();
    byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 
                 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 
                 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 
                 0x15, 0x16, 0x17 };

    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

    System.out.println(new String(input));

    // encryption pass
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
    ctLength += cipher.doFinal(cipherText, ctLength);
    System.out.println(new String(cipherText));
    System.out.println(ctLength);

    // decryption pass
    cipher.init(Cipher.DECRYPT_MODE, key);
    byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
    ptLength += cipher.doFinal(plainText, ptLength);
    System.out.println(new String(plainText));
    System.out.println(ptLength);
  }
}
14
Ethan Heilman

Je voudrais également vérifier la dissimulation pour voir si cela correspond à votre facture. Il possède une API facile à utiliser qui résume les détails cryptographiques: https://github.com/facebook/conceal/

1
user868459

Regardez ma réponse ici Cryptage de la base de données Android . Il contient 2 fichiers que vous pouvez inclure dans n’importe laquelle de vos applications nécessitant le chiffrement du stockage de données.

1
Plo_Koon

Considérant la surcharge de chiffrer et déchiffrer les données dans Android, j'ai conçu une bibliothèque qui ne repose que sur les bibliothèques natives Android et Java pour simplifier au maximum le processus.

Pour l’installer, utilisez le centre de distribution jcenter . 

compile 'com.tinmegali.Android:mcipher:0.4'

Utilisation

String ALIAS = "alias"
MEncryptor encryptor = new MEncryptorBuilder( ALIAS ).build();
MDecryptor decryptor = new MDecryptorBuilder( ALIAS ).build();

String toEncrypt = "encrypt this string";
// encrypting
String encrypted = encryptor.encryptString( toEncrypt, this );

// decrypting
String decrypted = decryptor.decryptString( encrypted, this );

Compatible avec le SDK 19+, MCipher s’adapte automatiquement aux blocs de données plus petits et plus volumineux. Par défaut, il utilise AES/GCM/NoPadding pour les SDK 23+ et RSA/ECB/PKCS1Padding pour les versions antérieures.

MCipher sur Github

0
Tin Megali