0

これに関連する多くの記事がウェブにあるにもかかわらず、この質問をするのは恥ずかしいですが、私はそれを理解できませんでした.私はこれに打たれました.

アルゴリズムを使用して Android でテキストを暗号化していますAES/CBC/PKCS5が、Windows 8 アプリストア アプリケーションでは復号化できませんでした。暗号化コードは次のとおりです。

public static String encrypt(String plainText,String password) throws Exception {

    // convert key to bytes
    byte[] keyBytes = password.getBytes("UTF-8");
    // Use the first 16 bytes (or even less if key is shorter)

    byte[] keyBytes16 = new byte[16];

    System.arraycopy(keyBytes, 0, keyBytes16, 0,
            Math.min(keyBytes.length, 16));

    // convert plain text to bytes
    byte[] plainBytes = plainText.getBytes("UTF-8");

    // setup cipher
    SecretKeySpec skeySpec = new SecretKeySpec(keyBytes16, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] iv = new byte[16]; // initialization vector with all 0
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, new IvParameterSpec(iv));

    // encrypt
    byte[] encrypted = cipher.doFinal(plainBytes);
    String encryptedString = Base64.encodeToString(
            cipher.doFinal(plainBytes), Base64.NO_WRAP);
    // encryptedString

    return Base64.encodeToString(encrypted, Base64.NO_WRAP);
}

Windows 8アプリケーションで次のコードを使用して暗号化しています

public string AES_Encrypt(string input, string pass)
{
  SymmetricKeyAlgorithmProvider SAP = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);

  string encrypted = "";
  try
  {
    byte[] test1 = System.Text.Encoding.UTF8.GetBytes(pass);
    byte[] test2 = new byte[16];

    for (int i = 0; i < test1.Length;i++ )
    {
      test2[i] = test1[i];
    }

    CryptographicKey key =
    SAP.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(test2));

    IBuffer Buffer = CryptographicBuffer.CreateFromByteArray(System.Text.Encoding.UTF8.GetBytes(input));
    encrypted = CryptographicBuffer.EncodeToBase64String(CryptographicEngine.Encrypt(key, Buffer, null));

    return encrypted;
  }
  catch (Exception ex)
  {
    return null;
  }
}

以下は復号化アルゴリズムです

public string AES_Decrypt(string input, string pass)
{

  SymmetricKeyAlgorithmProvider SAP = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);

  string decrypted = "";

  try
  {
    byte[] test1 = System.Text.Encoding.UTF8.GetBytes(pass);
    byte[] test2 = new byte[16];

    for (int i = 0; i < test1.Length;i++ )
    {
      test2[i] = test1[i];
    }

    CryptographicKey key = 
        SAP.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(test2));


    IBuffer Buffer = CryptographicBuffer.DecodeFromBase64String(input);
    byte[] Decrypted;

    CryptographicBuffer.CopyToByteArray(CryptographicEngine.Decrypt(key, Buffer, null), out Decrypted);
    decrypted = System.Text.Encoding.UTF8.GetString(Decrypted, 0, Decrypted.Length);
    return decrypted;
  }
  catch (Exception ex)
  {
    return null;
  }
}

生成される IV に問題があることはわかっています。Iv に を指定するnullと、復号化アルゴリズムが何らかの結果を生成します (間違っていますが)

どんな助けでも大歓迎です。

4

1 に答える 1