2011-06-06 11 views
3

私は2つのコードをPythonで作成し、もう1つは暗号化と復号化のためにandroid(eclipse)で作成しました。 今私はPythonを使用してデータを暗号化し、それを復号化するためにアンドロイドに送信します。暗号化python /復号化android

データを暗号化/復号化する2つの異なるプラットフォームを作成する方法 各プラットフォームには、暗号化と復号化を行う独自の方法があります。どうすればそれらをお互いに話すことができ、データやアンドロイドに送信された正確な情報を抽出できますか?

ヘルプが必要です。

+0

GenerateSalt()は解決策ですか? – SGLGG

+1

暗号化/復号化を行うコードを掲載してください。 –

+0

どの暗号化アルゴリズムを使用していますか? – jterrace

答えて

0

のPythonコード:

def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024): 
    if not out_filename: 
     out_filename = in_filename + '.enc' 

    iv = ''.join(chr(random.randint(0, 0xFF)) for i in range(16)) 
    encryptor = AES.new(key, AES.MODE_CBC, iv) 
    filesize = os.path.getsize(in_filename) 

    with open(in_filename, 'rb') as infile: 
     with open(out_filename, 'wb') as outfile: 
      outfile.write(struct.pack('<Q', filesize)) 
      outfile.write(iv) 

      while True: 
       chunk = infile.read(chunksize) 
       if len(chunk) == 0: 
        break 
       elif len(chunk) % 16 != 0: 
        chunk += ' ' * (16 - len(chunk) % 16) 

       outfile.write(encryptor.encrypt(chunk)) 

def decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024): 
    if not out_filename: 
     out_filename = os.path.splitext(in_filename)[0] 

    with open(in_filename, 'rb') as infile: 
     origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0] 
     iv = infile.read(16) 
     decryptor = AES.new(key, AES.MODE_CBC, iv) 

     with open(out_filename, 'wb') as outfile: 
      while True: 
       chunk = infile.read(chunksize) 
       if len(chunk) == 0: 
        break 
       outfile.write(decryptor.decrypt(chunk)) 

      outfile.truncate(origsize) 
0
Android Code: 
public static final int SALT_LENGTH = 20; 
public static final int PBE_ITERATION_COUNT = 1000; 

private static final String RANDOM_ALGORITHM = "SHA1PRNG"; 
private static final String PBE_ALGORITHM = "PBEWithSHA256And256BitAES-CBC-BC"; 
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; 

private static final String TAG = Act.class.getSimpleName(); 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    try { 

     String password = "password"; 
     String plainText = "plaintext message to be encrypted"; 

     // byte[] salt = generateSalt(); 
     byte[] salt = "dfghjklpoiuytgftgyhj".getBytes(); 
     Log.i(TAG, "Salt: " + salt.length + " " + HexEncoder.toHex(salt)); 
     PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, PBE_ITERATION_COUNT, 256); 
     SecretKeyFactory factory = SecretKeyFactory.getInstance(PBE_ALGORITHM); 
     SecretKey tmp = factory.generateSecret(pbeKeySpec); 
     SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 
     byte[] key = secret.getEncoded(); 
     Log.i(TAG, "Key: " + HexEncoder.toHex(key)); 

     // PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, ITERATION_COUNT); 

     Cipher encryptionCipher = Cipher.getInstance(CIPHER_ALGORITHM); 

     // byte[] encryptionSalt = generateSalt(); 
     // Log.i(TAG, "Encrypted Salt: " + encryptionSalt.length + " " + HexEncoder.toHex(encryptionSalt)); 
     // PBEParameterSpec pbeParamSpec = new PBEParameterSpec(encryptionSalt, 1000); 
     // byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
     Log.i(TAG, encryptionCipher.getParameters() + " "); 
     byte[] iv = generateIv(); 
     IvParameterSpec ivspec = new IvParameterSpec(iv); 

     encryptionCipher.init(Cipher.ENCRYPT_MODE, secret, ivspec); 
     byte[] encryptedText = encryptionCipher.doFinal(plainText.getBytes()); 
     Log.i(TAG, "Encrypted: " + HexEncoder.toHex(encryptedText)); 

     Cipher decryptionCipher = Cipher.getInstance(CIPHER_ALGORITHM); 
     decryptionCipher.init(Cipher.DECRYPT_MODE, secret, ivspec); 
     byte[] decryptedText = decryptionCipher.doFinal(encryptedText); 
     Log.i(TAG, "Decrypted: " + new String(decryptedText)); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

private byte[] generateSalt() throws NoSuchAlgorithmException { 
    SecureRandom random = SecureRandom.getInstance(RANDOM_ALGORITHM); 
    byte[] salt = new byte[SALT_LENGTH]; 
    random.nextBytes(salt); 
    return salt; 
} 

private byte[] generateIv() throws NoSuchAlgorithmException { 
    SecureRandom random = SecureRandom.getInstance(RANDOM_ALGORITHM); 
    byte[] iv = new byte[16]; 
    random.nextBytes(iv); 
    return iv; 
} 

}

+0

私は実際にアンドロイドコードでいくつかのprobsを持っています。 ? "HexEncoder.toHex()"は、定義されていないというエラーを返します... generateSalt()メソッドは、使用されていないことを示します。 助けが必要です..そしてThx! – SGLGG

0

TLSが確実に互換性のある方法でデータを送信するために使用することができます。

Python ssl server-side

あなたが通信のためにhttpプロトコルを使用して追加した場合、あなたからのすべての血みどろの詳細を隠すかもしれない高レベルのライブラリが既に存在しています。単にクライアント/サーバー証明書を提供し、適切な要求を行います。

Https Connection Android

このようなforward secrecyとして不十分多くのセキュリティ機能を再実装からあなたを救うかもしれません。あなたはAES CBCを使用してmcryptのと満足している場合は