এইএস ব্যবহার করে অ্যান্ড্রয়েড এনক্রিপশন / ডিক্রিপশন [বন্ধ]


105

অ্যান্ড্রয়েডে এইএস এর সাহায্যে চিত্র এবং অন্যান্য ফাইল কীভাবে এনক্রিপ্ট করা এবং ডিক্রিপ্ট করা যায় তার একটি ভাল উদাহরণ রয়েছে ?


7
অন্য জাভা এসই প্ল্যাটফর্মের চেয়ে অ্যান্ড্রয়েডে এনক্রিপশন মূলত পৃথক নয়। এবং নীচের সমস্ত উত্তর যেমন অনিরাপদ, তেমনি ক্রিপ্টোগ্রাফির উদাহরণগুলি প্রয়োগ বা ধার করা শুরু করার আগে আপনাকে ক্রিপ্টোগ্রাফিটি বুঝতে হবে।
মার্টেন বোদেউয়েস

উত্তর:


131

সতর্কতা: এই উত্তরে এমন কোড রয়েছে যা এটি অনিরাপদ হওয়ায় আপনার ব্যবহার করা উচিত নয় (কী ডেরাইভেশনের জন্য SHA1PRNG ব্যবহার করা এবং ইসিবি মোডে AES ব্যবহার করা)

পরিবর্তে (২০১ of হিসাবে), সিবিসি বা জিসিএম মোডে কী ডেরাইভেশন এবং এইএস-এর জন্য পিবিকেডিএফ 2WithHmacSHA1 ব্যবহার করুন (জিসিএম গোপনীয়তা এবং অখণ্ডতা উভয় সরবরাহ করে)

আপনি এই জাতীয় ফাংশন ব্যবহার করতে পারেন:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
}

এবং তাদের এইভাবে প্রার্থনা করুন:

ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); // bm is the bitmap object   
byte[] b = baos.toByteArray();  

byte[] keyStart = "this is a key".getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();    

// encrypt
byte[] encryptedData = encrypt(key,b);
// decrypt
byte[] decryptedData = decrypt(key,encryptedData);

এটি কাজ করা উচিত, আমি এখনই একটি প্রকল্পে অনুরূপ কোড ব্যবহার করি।


9
আরে এটি আমার পক্ষে কাজ করে না, ডিক্রিপ্ট করার সময় আমি বাদপ্যাডিং ব্যতিক্রম পাচ্ছি।
সনাত পান্ডে

34
সতর্কতা এই কোডটি কী উপার্জনের জন্য অ্যান্ড্রয়েড স্নিপেট থেকে পরিচিত খারাপ কোড ব্যবহার করছে। আপনি আপনার ডেটা আলগা করতে না চাইলে এটি ব্যবহার করবেন না। একটি বাছাই RNG হয় না একটি ভাল কী ডেরাইভেশন ফাংশন (KDF)।
মার্টেন বোদেউয়েস

2
@ আইসডড্যান্ট দয়া করে এই প্রশ্নটি দেখুন
মার্টেন বোদেউয়েস

35
সতর্কতা এই কোডটি বেশিরভাগ প্ল্যাটফর্মের ইসিবি মোড এনক্রিপশনে ডিফল্ট হতে পারে। ইসিবি মোড এনক্রিপশন ব্যবহার করা বেশিরভাগ ডেটার জন্য নিরাপদ নয়, কেবল ছবি ছেড়ে দিন। পেঙ্গুইন সন্ধান করুন !
মার্টেন বোদেউয়েস

10
@ মার্টেন বোদেউয়েস আমি বহু সংখ্যক পোস্টের আওতায় পুরো জায়গা জুড়ে আপনার সতর্কতাগুলি দেখতে পাচ্ছি। আপনি দয়া করে পরিবর্তে একটি ভাল সমাধান প্রদান করতে পারেন?
ইয়ার

16

যেমন নাচো.এল পিবিকেডিএফ 2 দ্বারা উল্লিখিত হিসাবে এটি আরও সুরক্ষিত হওয়ায় ব্যবহার করা হয় ma

import android.util.Base64;

import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class AESEncyption {

    private static final int pswdIterations = 10;
    private static final int keySize = 128;
    private static final String cypherInstance = "AES/CBC/PKCS5Padding";
    private static final String secretKeyInstance = "PBKDF2WithHmacSHA1";
    private static final String plainText = "sampleText";
    private static final String AESSalt = "exampleSalt";
    private static final String initializationVector = "8119745113154120";

    public static String encrypt(String textToEncrypt) throws Exception {

        SecretKeySpec skeySpec = new SecretKeySpec(getRaw(plainText, AESSalt), "AES");
        Cipher cipher = Cipher.getInstance(cypherInstance);
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(initializationVector.getBytes()));
        byte[] encrypted = cipher.doFinal(textToEncrypt.getBytes());
        return Base64.encodeToString(encrypted, Base64.DEFAULT);
    }

    public static String decrypt(String textToDecrypt) throws Exception {

        byte[] encryted_bytes = Base64.decode(textToDecrypt, Base64.DEFAULT);
        SecretKeySpec skeySpec = new SecretKeySpec(getRaw(plainText, AESSalt), "AES");
        Cipher cipher = Cipher.getInstance(cypherInstance);
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(initializationVector.getBytes()));
        byte[] decrypted = cipher.doFinal(encryted_bytes);
        return new String(decrypted, "UTF-8");
    }

    private static byte[] getRaw(String plainText, String salt) {
        try {
            SecretKeyFactory factory = SecretKeyFactory.getInstance(secretKeyInstance);
            KeySpec spec = new PBEKeySpec(plainText.toCharArray(), salt.getBytes(), pswdIterations, keySize);
            return factory.generateSecret(spec).getEncoded();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return new byte[0];
    }

}

3
সত্য এই ডেরাইভেশন অনেক ভাল। তবে এখন আপনি একটি স্ট্যাটিক চতুর্থ, একটি স্ট্যাটিক লবণ এবং একটি উপায় খুব কম পুনরাবৃত্তি গণনা ব্যবহার করছেন। সুতরাং সতর্কতা সহ ফলাফল এখনও অনিরাপদ। ক্রিপ্টো ডান পেতে একটি ব্যথা ...
মার্টেন বোদেউয়েস

13
import java.security.AlgorithmParameters;
import java.security.SecureRandom;
import java.security.spec.KeySpec;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

class SecurityUtils {

  private static final byte[] salt = { (byte) 0xA4, (byte) 0x0B, (byte) 0xC8,
      (byte) 0x34, (byte) 0xD6, (byte) 0x95, (byte) 0xF3, (byte) 0x13 };

  private static int BLOCKS = 128;

  public static byte[] encryptAES(String seed, String cleartext)
      throws Exception {
    byte[] rawKey = getRawKey(seed.getBytes("UTF8"));
    SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    return cipher.doFinal(cleartext.getBytes("UTF8"));
  }

  public static byte[] decryptAES(String seed, byte[] data) throws Exception {
    byte[] rawKey = getRawKey(seed.getBytes("UTF8"));
    SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    return cipher.doFinal(data);
  }

  private static byte[] getRawKey(byte[] seed) throws Exception {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
    sr.setSeed(seed);
    kgen.init(BLOCKS, sr); // 192 and 256 bits may not be available
    SecretKey skey = kgen.generateKey();
    byte[] raw = skey.getEncoded();
    return raw;
  }

  private static byte[] pad(byte[] seed) {
    byte[] nseed = new byte[BLOCKS / 8];
    for (int i = 0; i < BLOCKS / 8; i++)
      nseed[i] = 0;
    for (int i = 0; i < seed.length; i++)
      nseed[i] = seed[i];

    return nseed;
  }

  public static byte[] encryptPBE(String password, String cleartext)
      throws Exception {
    SecretKeyFactory factory = SecretKeyFactory
        .getInstance("PBKDF2WithHmacSHA1");
    KeySpec spec = new PBEKeySpec(password.toCharArray(), salt, 1024, 256);
    SecretKey tmp = factory.generateSecret(spec);
    SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secret);
    AlgorithmParameters params = cipher.getParameters();
    byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
    return cipher.doFinal(cleartext.getBytes("UTF-8"));
  }

  public static String decryptPBE(SecretKey secret, String ciphertext,
      byte[] iv) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));
    return new String(cipher.doFinal(ciphertext.getBytes()), "UTF-8");
  }

}

4
উপরের কোডটি অ্যান্ড্রয়েড 2.২-এ ব্যাডপ্যাডিংএক্সপশন নিক্ষেপ করেছে
ব্রিজেশ ঠাকুর

1
@BrijeshThakur - পড়া এই
t0mm13b

12
সতর্কতা এই কোডটি কী উপার্জনের জন্য অ্যান্ড্রয়েড স্নিপেট থেকে পরিচিত খারাপ কোড ব্যবহার করছে। আপনি আপনার ডেটা আলগা করতে না চাইলে এটি ব্যবহার করবেন না। একটি বীজযুক্ত আরএনজি হয় না একটি ভাল কী ডেরাইভেশন ফাংশন (KDF)।
মার্টেন বোদেউয়েস


9
সতর্কতা এই কোডটি বেশিরভাগ প্ল্যাটফর্মের ইসিবি মোড এনক্রিপশনে ডিফল্ট হতে পারে। ইসিবি মোড এনক্রিপশন ব্যবহার করা বেশিরভাগ ডেটার জন্য নিরাপদ নয়, কেবল ছবি ছেড়ে দিন। পেঙ্গুইন সন্ধান করুন !
মার্টেন বোডোয়েস

9

পুরানো প্রশ্ন তবে আমি উত্তরগুলি অ্যান্ড্রয়েড এর পূর্বের সমর্থন করে 4.2 পোস্ট করার পরে এবং অ্যান্ড্রয়েড বিকাশকারীদের ব্লগ অনুসারে সাম্প্রতিক সমস্ত পরিবর্তন বিবেচনা করে আপগ্রেড করছি

এছাড়াও আমি আমার উপর একটি কাজের উদাহরণ রেখেছি গিথুব রেপোতে

import java.nio.charset.Charset;
import java.security.AlgorithmParameters;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;


/*
* This software is provided 'as-is', without any express or implied
* warranty.  In no event will Google be held liable for any damages
* arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, as long as the origin is not misrepresented.
* 
* @author: Ricardo Champa
* 
*/

public class MyCipher {

    private final static String ALGORITHM = "AES";
    private String mySecret;

    public MyCipher(String mySecret){
        this.mySecret = mySecret;
    }

    public MyCipherData encryptUTF8(String data){
        try{
            byte[] bytes = data.toString().getBytes("utf-8");
            byte[] bytesBase64 = Base64.encodeBase64(bytes);
            return encrypt(bytesBase64);
        }
        catch(Exception e){
            MyLogs.show(e.getMessage());
            return null;
        }

    }

    public String decryptUTF8(byte[] encryptedData, IvParameterSpec iv){
        try {
            byte[] decryptedData = decrypt(encryptedData, iv);
            byte[] decodedBytes = Base64.decodeBase64(decryptedData);
            String restored_data = new String(decodedBytes, Charset.forName("UTF8"));
            return restored_data;
        } catch (Exception e) {
            MyLogs.show(e.getMessage());;
            return null;
        }
    }

    //AES
    private MyCipherData encrypt(byte[] raw, byte[] clear) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITHM);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        //solved using PRNGFixes class
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] data = cipher.doFinal(clear);

        AlgorithmParameters params = cipher.getParameters();
        byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
        return new MyCipherData(data, iv);
    }

    private byte[] decrypt(byte[] raw, byte[] encrypted, IvParameterSpec iv) throws Exception {
        SecretKeySpec skeySpec = new SecretKeySpec(raw, ALGORITHM);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
        byte[] decrypted = cipher.doFinal(encrypted);
        return decrypted;
    }

    private byte[] getKey() throws Exception{
        byte[] keyStart = this.mySecret.getBytes("utf-8");
        KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);

        SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
        //      if (android.os.Build.VERSION.SDK_INT >= 17) {
        //          sr = SecureRandom.getInstance("SHA1PRNG", "Crypto");
        //      } else {
        //          sr = SecureRandom.getInstance("SHA1PRNG");
        //      }
        sr.setSeed(keyStart);
        kgen.init(128, sr); // 192 and 256 bits may not be available
        SecretKey skey = kgen.generateKey();
        byte[] key = skey.getEncoded();
        return key;

    }
    ////////////////////////////////////////////////////////////
    private MyCipherData encrypt(byte[] data) throws Exception{
        return encrypt(getKey(),data);
    }
    private byte[] decrypt(byte[] encryptedData, IvParameterSpec iv) throws Exception{
        return decrypt(getKey(),encryptedData, iv);
    }
}


@ হামাদাতারিখসাহী? ¿
রিকার্ডো

বরং এ্যাপাচি কমন্স কোডেক গ্রন্থাগার ব্যবহার করার পরিবর্তে, সেখানে ব্যবহার করে যে কোনও অসুবিধা হয় android.util.Base64.encode(bytes, Base64.DEFAULT)এবং android.util.Base64.decode(decryptedData, Base64.DEFAULT)?
নিষিদ্ধ-জিওঞ্জিনিয়ারিং

2
সতর্কতা এই কোডটি কী উপার্জনের জন্য অ্যান্ড্রয়েড স্নিপেট থেকে পরিচিত খারাপ কোড ব্যবহার করছে। আপনি আপনার ডেটা আলগা করতে না চাইলে এটি ব্যবহার করবেন না। একটি বীজযুক্ত আরএনজি একটি ভাল কী ডেরাইভেশন ফাংশন (কেডিএফ) নয়। (দীর্ঘশ্বাস).
মার্টেন বোদেউয়েস

1
পুনঃটুইট করেছেন
রিকার্ডো

7

আপনি যদি কোনও পাঠ্য ফাইল এনক্রিপ্ট করছেন তবে নিম্নলিখিত পরীক্ষার / নমুনা কার্যকর হতে পারে। এটি নিম্নলিখিতগুলি করে:

  1. একটি বাইট স্ট্রিম তৈরি করুন,
  2. AES এনক্রিপশন সহ মোড়ানো যে,
  3. এটি পাঠ্য প্রক্রিয়াজাতকরণের সাথে মোড়ক করুন
  4. এবং শেষ পর্যন্ত এটি বাফার করে

    // AESdemo
    
    public class AESdemo extends Activity {
        boolean encryptionIsOn = true;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_aesdemo);
            // needs <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
            String homeDirName = Environment.getExternalStorageDirectory().getAbsolutePath() +
                    "/" + getPackageName();
            File file = new File(homeDirName, "test.txt");
            byte[] keyBytes = getKey("password");
    
            try {
                File dir = new File(homeDirName);
                if (!dir.exists())
                    dir.mkdirs();
                if (!file.exists())
                    file.createNewFile();
    
                OutputStreamWriter osw;
    
                if (encryptionIsOn) {
                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
                    IvParameterSpec ivParameterSpec = new IvParameterSpec(keyBytes);
                    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
    
                    FileOutputStream fos = new FileOutputStream(file);
                    CipherOutputStream cos = new CipherOutputStream(fos, cipher);
                    osw = new OutputStreamWriter(cos, "UTF-8");
                }
                else    // not encryptionIsOn
                    osw = new FileWriter(file);
    
                BufferedWriter out = new BufferedWriter(osw);
                out.write("This is a test\n");
                out.close();
            }
            catch (Exception e) {
                System.out.println("Encryption Exception "+e);
            }
    
            ///////////////////////////////////
            try {
                InputStreamReader isr;
    
                if (encryptionIsOn) {
                    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                    SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
                    IvParameterSpec ivParameterSpec = new IvParameterSpec(keyBytes);
                    cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
    
                    FileInputStream fis = new FileInputStream(file);
                    CipherInputStream cis = new CipherInputStream(fis, cipher);
                    isr = new InputStreamReader(cis, "UTF-8");
                }
                else
                    isr = new FileReader(file);
    
                BufferedReader in = new BufferedReader(isr);
                String line = in.readLine();
                System.out.println("Text read: <"+line+">");
                in.close();
            }
            catch (Exception e) {
                System.out.println("Decryption Exception "+e);
            }
        }
    
        private byte[] getKey(String password) throws UnsupportedEncodingException {
            String key = "";
            while (key.length() < 16)
                key += password;
            return key.substring(0, 16).getBytes("UTF-8");
        }
    }

8
সতর্কতা এই কোডটি একটি কী ডেরাইভেশন প্রক্রিয়া ব্যবহার করছে যা ডিফল্ট অক্ষর ডিকোডিং ব্যবহার করে। আপনার ডেটা ডিক্রিপ্ট করার ক্ষেত্রে সমস্যা না চাইলে এটি ব্যবহার করবেন না।
মার্টেন বোদেউয়েস

3
@ ওয়ালস্টেড, ভাল পর্যবেক্ষণ, যদি আপনি ঠিক করার পরামর্শ দিতেন তবে ভাল হত। GetKey () এ একটি অক্ষর এনকোডিং নির্দিষ্ট করতে এখন উপরের উদাহরণটি আপডেট করা হয়েছে। আরও সংশোধনী স্বাগত ...
সলোপাইলট

9
দুঃখিত, আমি এখানে মূলত উত্তরগুলি জ্বলছিলাম, কারণ তারা SecureRandomকী উত্সের জন্য ব্যবহার করেছিল । আপনি যদি কোনও সাইফার কীভাবে ইনস্ট্যান্ট করতে চান তা জানতে চাইলে এখানে এরিকসনের উত্তর চেক করুন । স্ট্যাটিক IV ব্যবহার করবেন না (একই কীটির জন্য) এবং পাসওয়ার্ড -> কী রূপান্তরকরণের জন্য PBKDF2 ব্যবহার করবেন না। মনে রাখবেন যে একটি অ-অনুমোদনপ্রাপ্ত সাইফার কেবলমাত্র গোপনীয়তা সরবরাহ করে এবং কেবল যদি এটি পরিবহন প্রোটোকলে ব্যবহার না করা হয়। আপনি যদি সহায়তা করতে চান তবে আপনি অন্যান্য উত্তরগুলিও পোড়াতে পারেন (এবং আমার মন্তব্যগুলি এখানে ভোট দিন) :)
মার্টেন বোদেউয়েস

@ মার্টেনবোডিউজ আপনাকে অনেক উত্তর "জ্বালিয়ে" দিয়েছে, কিন্তু আপনি কোনও উত্তর দেওয়ার প্রস্তাব করবেন না। আপনার যদি সঠিক উত্তর থাকে তবে আপনি এখানে একটি লেখেন না কেন?
ডিকা

@ ডিকা আমার মনে হয় আমি উপরে একটি উত্তর নির্দেশ করেছি। দয়া করে মনে রাখবেন যে আমি ক্রিপ্টোগ্রাফি এবং এনক্রিপশন উভয়টিতে সর্বাধিক উত্তর পোস্ট করা লোকটি খুব বড় মার্জিনের সাথে আছি । এছাড়াও মনে রাখবেন যে আমি জেনেরিক মোড়কের লাইব্রেরির বিপরীতে আছি যা লোকেরা নির্দিষ্ট ব্যবহারের ক্ষেত্রে কোড কোড লেখার চেয়ে কোড অনুলিপি করার পক্ষে নেতৃত্ব দেয়। জাভা ক্রিপ্টো এপিআইটি বরং কিছুটা জটিল if যে ব্যবহার! চিত্র এনক্রিপশন সম্পর্কে বিশেষ কিছুই নেই; এটি বেসিক ফাইল এনক্রিপশন।
মার্টেন বোদেউয়েস

5

অ্যান্ড্রয়েডে এইএস এনক্রিপ্ট / ডিক্রিপ্ট

String encData= encrypt("keykey".getBytes("UTF-16LE"), ("0123000000000215").getBytes("UTF-16LE"));

String decData= decrypt("keykey",Base64.decode(encData.getBytes("UTF-16LE"), Base64.DEFAULT));

এনক্রিপ্ট ফাংশন

private static String encrypt(byte[] key, byte[] clear) throws Exception
    {
        MessageDigest md = MessageDigest.getInstance("md5");
        byte[] digestOfPassword = md.digest(key);

        SecretKeySpec skeySpec = new SecretKeySpec(digestOfPassword, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(clear);
        return Base64.encodeToString(encrypted,Base64.DEFAULT);
    }

ডিক্রিপ্ট ফাংশন

private static String decrypt(String key, byte[] encrypted) throws Exception
    {
        MessageDigest md = MessageDigest.getInstance("md5");
        byte[] digestOfPassword = md.digest(key.getBytes("UTF-16LE"));

        SecretKeySpec skeySpec = new SecretKeySpec(digestOfPassword, "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec);
        byte[] decrypted = cipher.doFinal(encrypted);
        return new String(decrypted, "UTF-16LE");
    }

সিএস এ এএস এনক্রিপ্ট / ডিক্রিপ্ট

 static void Main(string[] args)
        {
            string enc = encryptAES("0123000000000215", "keykey");
            string dec = decryptAES(enc, "keykey");

            Console.ReadKey();
        }

এনক্রিপ্ট ফাংশন

 public static string encryptAES(string input, string key)
        {
            var plain = Encoding.Unicode.GetBytes(input);

            // 128 bits
            AesCryptoServiceProvider provider = new AesCryptoServiceProvider();
            provider.KeySize = 128;
            provider.Mode = CipherMode.ECB;
            provider.Padding = PaddingMode.PKCS7;

            provider.Key = CalculateMD5Hash(key);

            var enc = provider.CreateEncryptor().TransformFinalBlock(plain, 0, plain.Length);
            return Convert.ToBase64String(enc);
        }

ডিক্রিপ্ট ফাংশন

public static string decryptAES(string encryptText, string key)
{
    byte[] enc = Convert.FromBase64String(encryptText);
    // 128 bits
    AesCryptoServiceProvider provider = new AesCryptoServiceProvider();
    provider.KeySize = 128;
    provider.Mode = CipherMode.ECB;
    provider.Padding = PaddingMode.PKCS7;

    provider.Key = CalculateMD5Hash(key);


    var dec = provider.CreateDecryptor().TransformFinalBlock(enc, 0, enc.Length);
    return Encoding.Unicode.GetString(dec);
}

এমডি 5 তৈরি করুন

 public static byte[] CalculateMD5Hash(string input)
        {
            MD5 md5 = MD5.Create();
            byte[] inputBytes = Encoding.Unicode.GetBytes(input);
            return md5.ComputeHash(inputBytes);
        }

1
MD5 কোনও পাসওয়ার্ড হ্যাশ বা পাসওয়ার্ড ভিত্তিক কী ডেরিভেশন ফাংশন নয়। আপনি যদি কোনও পাসওয়ার্ড ব্যবহার করেন তবে এটি সঠিকভাবে ব্যবহার করুন।
মার্টেন বোদেউয়েস

5

এইএস / সিবিসি / পিকেসিএস 7 এনক্রিপশন / ডিক্রিপশন-এর জন্য কেবল নীচের কোডটি অনুলিপি করুন এবং পেস্ট করুন এবং প্রতিস্থাপন করুন SecretKeyএবং IVআপনার নিজের সাথে।

import java.io.UnsupportedEncodingException;
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.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import android.util.Base64;


public class CryptoHandler {

    String SecretKey = "xxxxxxxxxxxxxxxxxxxx";
    String IV = "xxxxxxxxxxxxxxxx";

    private static CryptoHandler instance = null;

    public static CryptoHandler getInstance() {

        if (instance == null) {
            instance = new CryptoHandler();
        }
        return instance;
    }

    public String encrypt(String message) throws NoSuchAlgorithmException,
            NoSuchPaddingException, IllegalBlockSizeException,
            BadPaddingException, InvalidKeyException,
            UnsupportedEncodingException, InvalidAlgorithmParameterException {

        byte[] srcBuff = message.getBytes("UTF8");
        //here using substring because AES takes only 16 or 24 or 32 byte of key 
        SecretKeySpec skeySpec = new 
        SecretKeySpec(SecretKey.substring(0,32).getBytes(), "AES");
        IvParameterSpec ivSpec = new 
        IvParameterSpec(IV.substring(0,16).getBytes());
        Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        ecipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivSpec);
        byte[] dstBuff = ecipher.doFinal(srcBuff);
        String base64 = Base64.encodeToString(dstBuff, Base64.DEFAULT);
        return base64;
    }

    public String decrypt(String encrypted) throws NoSuchAlgorithmException,
            NoSuchPaddingException, InvalidKeyException,
            InvalidAlgorithmParameterException, IllegalBlockSizeException,
            BadPaddingException, UnsupportedEncodingException {

        SecretKeySpec skeySpec = new 
        SecretKeySpec(SecretKey.substring(0,32).getBytes(), "AES");
        IvParameterSpec ivSpec = new 
        IvParameterSpec(IV.substring(0,16).getBytes());
        Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        ecipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
        byte[] raw = Base64.decode(encrypted, Base64.DEFAULT);
        byte[] originalBytes = ecipher.doFinal(raw);
        String original = new String(originalBytes, "UTF8");
        return original;
    }
}

আপনি কি এমন ফাংশন যুক্ত করবেন যা ফাইলটি এনকোড করতে পারে? রিটার্নের
ধরণটি

1
আপনার কেবল শ্রেণিবদ্ধভাবে এই ফাংশনগুলি কল করতে হবে। যেমন। CryptoHandler.encrypt ("আপনার STRING যা আপনি এনক্রিপ্ট করতে চান") এবং এটির মতোই আপনি ডিক্রিপ্ট () ডেকেও কল করতে পারেন। এবং উভয় ফাংশন স্ট্রিং ফিরে।
সুজিৎ কুমার গুপ্ত 9

2
সতর্কতা একটি কী কোনও স্ট্রিং নয়, একটি কী এবং IV ব্যবহারকারীর দ্বারা "বাছাই" করা উচিত নয়। সিবিসি সুরক্ষিত হওয়ার জন্য একটি চতুর্থ অপ্রত্যাশিত (এলোমেলো থেকে পৃথক) vers আর একটি ব্যর্থ প্রচেষ্টা, ক্রিপ্টোগ্রাফি না পাওয়ার জন্য আপনি # 10 এর বেশি এবং এখনও "উদাহরণ" সরবরাহ করতে ইচ্ছুক। এটি কেবল একটি কোডের উত্তরও, এটি কী ধরণের সুরক্ষা সরবরাহ করে তা ব্যাখ্যা করে না।
মার্টেন বোদেউয়েস

2

অ্যান্ড্রয়েডে AES এনক্রিপশন সম্পাদন করার জন্য সহজ এপিআই। এটি এইএসক্রিপট লাইব্রেরির রুবি এবং ওবজ-সি (একই ডিফল্ট সহ) এর অ্যান্ড্রয়েড অংশীদার:

https://github.com/scottyab/AESCrypt-Android


7
সমস্যাটি সমাধান করতে কীভাবে এই গ্রন্থাগারটি ব্যবহার করা যেতে পারে আপনি কিছুটা প্রসারিত করতে পারেন? গিটহাবের বর্ণনাটি কেবল অনুলিপি করা এবং এর সাথে একটি লিঙ্ক যুক্ত করা সমস্ত সহায়ক নয় এবং কিছুটা ব্যাখ্যা দিয়ে আপনার উত্তরটি আরও ভাল হতে পারে।
জোনাসসিজে -

1

AES এনক্রিপশন এবং ডিক্রিপশন এর জন্য কাজ করছে এমন সাধারণ কোড স্নিপেট।

import android.util.Base64;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class AESEncryptionClass {

    private static String INIT_VECTOR_PARAM = "#####";
    private static String PASSWORD = "#####";
    private static String SALT_KEY = "#####";

    private static SecretKeySpec generateAESKey() throws NoSuchAlgorithmException, InvalidKeySpecException {

        // Prepare password and salt key.
        char[] password = new String(Base64.decode(PASSWORD, Base64.DEFAULT)).toCharArray();
        byte[] salt = new String(Base64.decode(SALT_KEY, Base64.DEFAULT)).getBytes(StandardCharsets.UTF_8);

        // Create object of  [Password Based Encryption Key Specification] with required iteration count and key length.
        KeySpec spec = new PBEKeySpec(password, salt, 64, 256);

        // Now create AES Key using required hashing algorithm.
        SecretKey key = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1").generateSecret(spec);

        // Get encoded bytes of secret key.
        byte[] bytesSecretKey = key.getEncoded();

        // Create specification for AES Key.
        SecretKeySpec secretKeySpec = new SecretKeySpec(bytesSecretKey, "AES");
        return secretKeySpec;
    }

    /**
     * Call this method to encrypt the readable plain text and get Base64 of encrypted bytes.
     */
    public static String encryptMessage(String message) throws BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeySpecException, InvalidAlgorithmParameterException, InvalidKeyException {

        byte[] initVectorParamBytes = new String(Base64.decode(INIT_VECTOR_PARAM, Base64.DEFAULT)).getBytes(StandardCharsets.UTF_8);

        Cipher encryptionCipherBlock = Cipher.getInstance("AES/CBC/PKCS5Padding");
        encryptionCipherBlock.init(Cipher.ENCRYPT_MODE, generateAESKey(), new IvParameterSpec(initVectorParamBytes));

        byte[] messageBytes = message.getBytes();
        byte[] cipherTextBytes = encryptionCipherBlock.doFinal(messageBytes);
        String encryptedText = Base64.encodeToString(cipherTextBytes, Base64.DEFAULT);
        return encryptedText;
    }

    /**
     * Call this method to decrypt the Base64 of encrypted message and get readable plain text.
     */
    public static String decryptMessage(String base64Cipher) throws BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeySpecException, InvalidAlgorithmParameterException, InvalidKeyException {

        byte[] initVectorParamBytes = new String(Base64.decode(INIT_VECTOR_PARAM, Base64.DEFAULT)).getBytes(StandardCharsets.UTF_8);

        Cipher decryptionCipherBlock = Cipher.getInstance("AES/CBC/PKCS5Padding");
        decryptionCipherBlock.init(Cipher.DECRYPT_MODE, generateAESKey(), new IvParameterSpec(initVectorParamBytes));

        byte[] cipherBytes = Base64.decode(base64Cipher, Base64.DEFAULT);
        byte[] messageBytes = decryptionCipherBlock.doFinal(cipherBytes);
        String plainText = new String(messageBytes);
        return plainText;
    }
}

এখন , প্রয়োজনীয় পরামিতিগুলির সাথে কাঙ্ক্ষিত অপারেশনের জন্য কল করুন encryptMessage()বা করুন ।decryptMessage()AES

এছাড়াও , AESঅপারেশন চলাকালীন ব্যতিক্রমগুলি পরিচালনা করুন।

আশা করি এটি সাহায্য করেছে ...


1
একটি স্থির লবণ এবং চতুর্থ নিরাপদ নয়।
মার্টেন বোদেউয়েস

0

অ্যান্ড্রয়েড প্রকল্পে বাউন্সি দুর্গ যুক্ত করতে: https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16/1.45

আপনার প্রধান কার্যকলাপে এই লাইনটি যুক্ত করুন:

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

public class AESHelper {

    private static final String TAG = "AESHelper";

    public static byte[] encrypt(byte[] data, String initVector, String key) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            SecretKeySpec k = new SecretKeySpec(Base64.decode(key, Base64.DEFAULT), "AES");
            c.init(Cipher.ENCRYPT_MODE, k, iv);
            return c.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static byte[] decrypt(byte[] data, String initVector, String key) {
        try {
            IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
            Cipher c = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            SecretKeySpec k = new SecretKeySpec(Base64.decode(key, Base64.DEFAULT), "AES");
            c.init(Cipher.DECRYPT_MODE, k, iv);
            return c.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static String keyGenerator() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(192);

        return Base64.encodeToString(keyGenerator.generateKey().getEncoded(),
                Base64.DEFAULT);
    }
}


আমি মনে করি না এর জন্য আপনার বাউন্সি দরকার; এটি কেবলমাত্র নিশ্চিত করবে যে আপনি বড় ফাইলগুলির (যেমন চিত্রগুলির) জন্য হার্ডওয়্যার ত্বরণ এবং হত্যা কর্মক্ষমতা ব্যবহার করতে পারবেন না। 64 বেসে কীটি এনকোড করা খারাপ ধারণা; এটি একটি মূল স্টোরে সংরক্ষণ করা আরও ভাল।
মার্টেন বোদেউয়েস

0

এটি আমার জন্য কাজ করছে নীচের কোড দিয়ে চেষ্টা করুন।

public static String decrypt(String encrypted) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
    byte[] key = your Key in byte array;
    byte[] input = salt in byte array;

    SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(input);
    Cipher ecipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    ecipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);

    byte[] raw = Base64.decode(encrypted, Base64.DEFAULT);
    byte[] originalBytes = ecipher.doFinal(raw);

    String original = new String(originalBytes, "UTF8");
    return original;
}

1
ক্রিপ্টো কোড কেবল কাজ করা উচিত নয়, এটি সুরক্ষিত হওয়া উচিত। আপনার কোডটি কী ধরণের সুরক্ষা সরবরাহ করে (বা এই ক্ষেত্রে, সরবরাহ করে না?) আপনি কি তা নির্দেশিত করতে পারেন
মার্টেন বোদেউয়েস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.