Android integrando PGP in un progetto

Sono abbastanza familiare con PGP e il modo in cui funziona. Vorrei includere alcune funzionalità in un progetto, ma finora la mia ricerca ha lasciato la mia testa di filatura. Quello che vorrei fare è creare una chiave pubblica con una definita passata privata. Da lì, condividere la chiave pubblica con qualcuno where possono crittografare un messaggio usando la chiave e restituirlo where posso decriptare. Immagino che il codice abbia un aspetto simile.

Per generare il mio codice privato pgp:

  • Android: riproduzione di un suono di asset utilizzando WebView
  • toDataURL non funziona su browser Android
  • Modifica del colore dell'intestazione nella vista multitask?
  • Animazione del colore di text
  • Compilare il colore su bitmap in android
  • Utilizzo di Android: l'attributo Digits per limitare i caratteri interrompe l'azione dopo il funzionamento del button
  • PGPKey key = new PGPKey(); key.setPassPhrase("MySecretPassword!!!1"); key.generateRandomSharedKey(); key.build(); 

    Per crittografare darei il mio codice condiviso ad un amico:

     String encryptedText = PGPTools.Encrypt("Text to encrypt", getSharedKey()); 

    Per decrittografare la string crittografata dopo essere stata inviata a me:

     String decryptedText = PGPTools.Decrypt(encryptedText, key, "MySecretPassword!!!1") 

    Ovviamente so che sto saltando fuori su un sacco di dettagli. Attraverso la mia ricerca ho visto riferimenti a librerie come il Castello Bouncy e il Castello Spongy. Qualsiasi aiuto sarebbe enormemente apprezzato!

  • Ottenere l'indirizzo MAC Bluetooth tramite adb
  • come mettere in pausa e riprendere un thread surfaceView
  • Caricare l'IMMAGINE dall'URL di JSON in listview
  • Modifica text senza Autocorrezione
  • La creazione di Android non riesce più a com.android.dex.DexException: più file dex definiscono Landroid / support
  • Come sapere quale vista all'interno di un object ListView specifico che è stato cliccato
  • 2 Solutions collect form web for “Android integrando PGP in un progetto”

    Voglio pubblicare la mia soluzione perché A. è stato estremamente difficile get questo lavoro e B. Se un crypto pro desidera controllare il mio codice sarò eternamente grato.

    Ho incluso le 4 seguenti biblioteche:

     compile 'com.madgag.spongycastle:core:1.50.0.0' compile 'com.madgag.spongycastle:pg:1.50.0.0' compile 'com.madgag.spongycastle:pkix:1.50.0.0' compile 'com.madgag.spongycastle:prov:1.50.0.0' 

    Bouncy Castle deve essere aggiunto come provider di sicurezza. Ho incluso questo codice in una class che inizializza alcuni altri oggetti quando l'applicazione viene caricata.

     static { Security.addProvider(new BouncyCastleProvider()); } 

    Ecco la class utils che ho creato che contiene veramente i dadi ei bulloni. Modificato leggermente:

     import com.example.Device; import org.spongycastle.bcpg.ArmoredInputStream; import org.spongycastle.bcpg.ArmoredOutputStream; import org.spongycastle.bcpg.HashAlgorithmTags; import org.spongycastle.bcpg.SymmetricKeyAlgorithmTags; import org.spongycastle.bcpg.sig.Features; import org.spongycastle.bcpg.sig.KeyFlags; import org.spongycastle.crypto.generators.RSAKeyPairGenerator; import org.spongycastle.crypto.params.RSAKeyGenerationParameters; import org.spongycastle.openpgp.PGPCompressedData; import org.spongycastle.openpgp.PGPCompressedDataGenerator; import org.spongycastle.openpgp.PGPEncryptedData; import org.spongycastle.openpgp.PGPEncryptedDataGenerator; import org.spongycastle.openpgp.PGPEncryptedDataList; import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPKeyPair; import org.spongycastle.openpgp.PGPKeyRingGenerator; import org.spongycastle.openpgp.PGPLiteralData; import org.spongycastle.openpgp.PGPLiteralDataGenerator; import org.spongycastle.openpgp.PGPObjectFactory; import org.spongycastle.openpgp.PGPPrivateKey; import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKeyEncryptedData; import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSignature; import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator; import org.spongycastle.openpgp.PGPUtil; import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor; import org.spongycastle.openpgp.operator.PBESecretKeyEncryptor; import org.spongycastle.openpgp.operator.PGPDigestCalculator; import org.spongycastle.openpgp.operator.bc.BcPBESecretKeyDecryptorBuilder; import org.spongycastle.openpgp.operator.bc.BcPBESecretKeyEncryptorBuilder; import org.spongycastle.openpgp.operator.bc.BcPGPContentSignerBuilder; import org.spongycastle.openpgp.operator.bc.BcPGPDigestCalculatorProvider; import org.spongycastle.openpgp.operator.bc.BcPGPKeyPair; import org.spongycastle.openpgp.operator.bc.BcPublicKeyDataDecryptorFactory; import org.spongycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder; import org.spongycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigInteger; import java.nio.charset.Charset; import java.security.SecureRandom; import java.util.Date; import java.util.Iterator; public class PgpUtils { private static final String PROVIDER = "SC"; private static final String KEY_RING_ID = "asdf@asdf.com"; public static String decrypt(String encryptedText, String password) throws Exception { byte[] encrypted = encryptedText.getBytes(); InputStream in = new ByteArrayInputStream(encrypted); in = PGPUtil.getDecoderStream(in); PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPEncryptedDataList enc; Object o = pgpF.nextObject(); if (o instanceof PGPEncryptedDataList) { enc = (PGPEncryptedDataList) o; } else { enc = (PGPEncryptedDataList) pgpF.nextObject(); } PGPPrivateKey sKey = null; PGPPublicKeyEncryptedData pbe = null; while (sKey == null && enc.getEncryptedDataObjects().hasNext()) { pbe = (PGPPublicKeyEncryptedData)enc.getEncryptedDataObjects().next(); sKey = getPrivateKey(getPGPSecretKeyRing(), pbe.getKeyID(), password.toCharArray()); } if (pbe != null) { InputStream clear = pbe.getDataStream(new BcPublicKeyDataDecryptorFactory(sKey)); PGPObjectFactory pgpFact = new PGPObjectFactory(clear); PGPCompressedData cData = (PGPCompressedData) pgpFact.nextObject(); pgpFact = new PGPObjectFactory(cData.getDataStream()); PGPLiteralData ld = (PGPLiteralData) pgpFact.nextObject(); InputStream unc = ld.getInputStream(); ByteArrayOutputStream out = new ByteArrayOutputStream(); int ch; while ((ch = unc.read()) >= 0) { out.write(ch); } byte[] returnBytes = out.toByteArray(); out.close(); return new String(returnBytes); } return null; } private static PGPPublicKey getPublicKey(PGPPublicKeyRing publicKeyRing) { Iterator<?> kIt = publicKeyRing.getPublicKeys(); while (kIt.hasNext()) { PGPPublicKey k = (PGPPublicKey) kIt.next(); if (k.isEncryptionKey()) { return k; } } return null; } private static PGPPrivateKey getPrivateKey(PGPSecretKeyRing keyRing, long keyID, char[] pass) throws PGPException { PGPSecretKey secretKey = keyRing.getSecretKey(keyID); PBESecretKeyDecryptor decryptor = new BcPBESecretKeyDecryptorBuilder(new BcPGPDigestCalculatorProvider()).build(pass); return secretKey.extractPrivateKey(decryptor); } public static String encrypt(String msgText) throws IOException, PGPException { byte[] clearData = msgText.getBytes(); PGPPublicKey encKey = getPublicKey(getPGPPublicKeyRing()); ByteArrayOutputStream encOut = new ByteArrayOutputStream(); OutputStream out = new ArmoredOutputStream(encOut); ByteArrayOutputStream bOut = new ByteArrayOutputStream(); PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedDataGenerator.ZIP); OutputStream cos = comData.open(bOut); PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator(); OutputStream pOut = lData.open(cos, PGPLiteralData.BINARY, PGPLiteralData.CONSOLE, clearData.length, new Date()); pOut.write(clearData); lData.close(); comData.close(); PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator( new JcePGPDataEncryptorBuilder(PGPEncryptedData.AES_256).setWithIntegrityPacket(true).setSecureRandom( new SecureRandom()).setProvider(PROVIDER)); if (encKey != null) { encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider(PROVIDER)); byte[] bytes = bOut.toByteArray(); OutputStream cOut = encGen.open(out, bytes.length); cOut.write(bytes); cOut.close(); } out.close(); return new String(encOut.toByteArray()); } public final static PGPKeyRingGenerator generateKeyRingGenerator (char[] pass) throws PGPException{ RSAKeyPairGenerator kpg = new RSAKeyPairGenerator(); kpg.init(new RSAKeyGenerationParameters(BigInteger.valueOf(0x10001), new SecureRandom(), 2048, 12)); PGPKeyPair rsakp_sign = new BcPGPKeyPair(PGPPublicKey.RSA_SIGN, kpg.generateKeyPair(), new Date()); PGPKeyPair rsakp_enc = new BcPGPKeyPair(PGPPublicKey.RSA_ENCRYPT, kpg.generateKeyPair(), new Date()); PGPSignatureSubpacketGenerator signhashgen = new PGPSignatureSubpacketGenerator(); signhashgen.setKeyFlags(false, KeyFlags.SIGN_DATA|KeyFlags.CERTIFY_OTHER|KeyFlags.SHARED); signhashgen.setPreferredSymmetricAlgorithms(false, new int[]{SymmetricKeyAlgorithmTags.AES_256, SymmetricKeyAlgorithmTags.AES_192, SymmetricKeyAlgorithmTags.AES_128}); signhashgen.setPreferredHashAlgorithms(false, new int[]{HashAlgorithmTags.SHA256, HashAlgorithmTags.SHA1, HashAlgorithmTags.SHA384, HashAlgorithmTags.SHA512, HashAlgorithmTags.SHA224}); signhashgen.setFeature(false, Features.FEATURE_MODIFICATION_DETECTION); PGPSignatureSubpacketGenerator enchashgen = new PGPSignatureSubpacketGenerator(); enchashgen.setKeyFlags(false, KeyFlags.ENCRYPT_COMMS | KeyFlags.ENCRYPT_STORAGE); PGPDigestCalculator sha1Calc = new BcPGPDigestCalculatorProvider().get(HashAlgorithmTags.SHA1); PGPDigestCalculator sha256Calc = new BcPGPDigestCalculatorProvider().get(HashAlgorithmTags.SHA256); PBESecretKeyEncryptor pske = (new BcPBESecretKeyEncryptorBuilder(PGPEncryptedData.AES_256, sha256Calc, 0xc0)).build(pass); PGPKeyRingGenerator keyRingGen = new PGPKeyRingGenerator (PGPSignature.POSITIVE_CERTIFICATION, rsakp_sign, KEY_RING_ID, sha1Calc, signhashgen.generate(), null, new BcPGPContentSignerBuilder(rsakp_sign.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA1), pske); keyRingGen.addSubKey(rsakp_enc, enchashgen.generate(), null); return keyRingGen; } private static PGPPublicKeyRing getPGPPublicKeyRing() throws IOException { ArmoredInputStream ais = new ArmoredInputStream(new ByteArrayInputStream(Device.getDevice().getPgpPublicKey().getBytes())); return (PGPPublicKeyRing) new PGPObjectFactory(ais).nextObject(); } private static PGPSecretKeyRing getPGPSecretKeyRing() throws IOException { ArmoredInputStream ais = new ArmoredInputStream(new ByteArrayInputStream(Device.getDevice().getPgpSecretKey().getBytes())); return (PGPSecretKeyRing) new PGPObjectFactory(ais).nextObject(); } public final static String genPGPPublicKey (PGPKeyRingGenerator krgen) throws IOException { ByteArrayOutputStream baosPkr = new ByteArrayOutputStream(); PGPPublicKeyRing pkr = krgen.generatePublicKeyRing(); ArmoredOutputStream armoredStreamPkr = new ArmoredOutputStream(baosPkr); pkr.encode(armoredStreamPkr); armoredStreamPkr.close(); return new String(baosPkr.toByteArray(), Charset.defaultCharset()); } public final static String genPGPPrivKey (PGPKeyRingGenerator krgen) throws IOException { ByteArrayOutputStream baosPriv = new ByteArrayOutputStream (); PGPSecretKeyRing skr = krgen.generateSecretKeyRing(); ArmoredOutputStream armoredStreamPriv = new ArmoredOutputStream(baosPriv); skr.encode(armoredStreamPriv); armoredStreamPriv.close(); return new String(baosPriv.toByteArray(), Charset.defaultCharset()); } } 

    Ecco come creo le chiavi private e pubbliche:

     final PGPKeyRingGenerator krgen = PgpUtils.generateKeyRingGenerator("password".toCharArray()); String pgpPublicKey = PgpUtils.genPGPPublicKey(krgen); String pgpSecretKey = PgpUtils.genPGPPrivKey(krgen); 

    E finalmente crittografare e decrittografare utilizzando la propria chiave pubblica:

     String encrypted = PgpUtils.encrypt("message text"); String decrypted = PgpUtils.decrypt(encrypted, "Password"); 

    Sembra che tu voglia generare una coppia di chiavi pubbliche utilizzando BouncyCastle?

    Questo chiede come farlo senza una password, ma puoi anche dare un'occhiata a come fare con una password: Come generare OpenPGP KeyPair senza passphrase utilizzando BouncyCastle?

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.