当前位置: 首页 > 面试题库 >

自Android 6棉花糖以来,javax.crypto.Cipher的工作方式有所不同

苗阳文
2023-03-14
问题内容

我已经成功使用javax.crypto.Cipher.getInstance(“ DESede / CBC /
NoPadding”)在Android上通过DESFire卡进行身份验证 。它可以在Android
4到5的多种设备上运行,但是在我更新为6棉花糖(和6.0.1)的Nexus 7上停止了工作。在更新之前,它一直在同一设备上工作。

似乎Cipher的工作方式不同,对于相同的密钥和数据给出不同的结果。运行以下代码…

public static void testCipher() throws Exception
{
    byte[] KEY =
            new byte[]{
                    (byte) 0x0C, (byte) 0x09, (byte) 0x03, (byte) 0x0E,
                    (byte) 0x05, (byte) 0x0A, (byte) 0x0D, (byte) 0x02,
                    (byte) 0x03, (byte) 0x0A, (byte) 0x09, (byte) 0x0B,
                    (byte) 0x06, (byte) 0x10, (byte) 0x04, (byte) 0x10
            };

    byte[] DATA =
            new byte[]{
                    (byte) 0x29, (byte) 0xDA, (byte) 0xC0, (byte) 0xC4,
                    (byte) 0xB8, (byte) 0x47, (byte) 0x13, (byte) 0xA2};

    byte[] newByte8 = new byte[8]; //Zeroes

    android.util.Log.d("TEST", "KEY : " + bin2hex(KEY));
    android.util.Log.d("TEST", "DATA: " + bin2hex(DATA));
    android.util.Log.d("TEST", "IVPS: " + bin2hex(newByte8));
    android.util.Log.d("TEST", "----");

    javax.crypto.Cipher cipher =
            javax.crypto.Cipher.getInstance("DESede/CBC/NoPadding");

    cipher.init(
            Cipher.DECRYPT_MODE,
            new javax.crypto.spec.SecretKeySpec(KEY, "DESede"),
            new javax.crypto.spec.IvParameterSpec(newByte8));

    byte[] result = cipher.doFinal(DATA);

    android.util.Log.d("TEST", "RSLT: " + bin2hex(result));
}

public static String bin2hex(byte[] data) {
    return String.format("%0" + (data.length * 2) + "X", new java.math.BigInteger(1, data));
}

…给我以下输出:

KEY : 0C09030E050A0D02030A090B06100410
DATA: 29DAC0C4B84713A2
IVPS: 0000000000000000
----
RSLT: 47BC415065B8155E

正常值(应该是正常值)始终有效,并且卡最终会正确进行身份验证,因此它按照卡期望的方式进行操作。就像我说过的,我尝试了几种设备(Android
4和5),它们给出了相同的结果。

但是现在在使用棉花糖的Nexus 7上我得到了其他东西(认证最终失败)

RSLT: F3ADA5969FA9369C

库中有什么变化吗?


问题答案:

发出了一个Android错误:https
:
//code.google.com/p/android/issues/detail?can=2&start=0&num=100&q=
triple%20des
&colspec=
ID%20Status%20Priority%20Owner%20Summary%20Stars% 20Reporter
%20Opened&groupby =&sort =&id =
189292

您还可以通过将密钥更改为24字节len来解决问题,如下所示:

    MessageDigest md = MessageDigest.getInstance("MD5");
seed_key = md.digest(new String(key).getBytes());

if (seed_key.length == 16) {
    byte[] tempkey = new byte[24];
    System.arraycopy(seed_key, 0, tempkey, 0, 16);
    System.arraycopy(seed_key, 0, tempkey, 16, 8);

    seed_key = tempkey;
}
SecretKeySpec keySpec = new SecretKeySpec(seed_key, "DESede");
nCipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
byte[] IVector = new byte[] { 27, 9, 45, 27, 0, 72, (byte) 171, 54 };
IvParameterSpec iv = new IvParameterSpec(IVector);
nCipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);

byte[] cipherbyte = nCipher.doFinal(data.getBytes());
encodeTxt = new String(Base64.encodeBase64(cipherbyte));


 类似资料:
  • 问题内容: 我在Android 6.0(棉花糖)上遇到了日期格式问题。引发以下异常的代码是我的应用程序用于API请求(“客户端”)的纯Java库(单独构建)。如果相关的话,该库是用Java 1.6构建的……无论如何,这是代码。 … 具有价值; …“修剪”之后是; 该代码自Froyo成立以来一直有效,并且已经过单元测试。除了棉花糖,所有东西都会抛出异常。 偏移量“ 21”是10:59中“ 9”之后的

  • 问题内容: 我正在创建一个可产生现场乐器声音的应用程序,并且计划使用Android棉花糖(6.0版)中的新Midi API。我已经在http://developer.android.com/reference/android/media/midi/package- summary.html上 阅读了软件包概述文档,并且我知道如何生成Midi笔记,但是我仍然不确定:我该怎么办在生成它们的Midi数据

  • 当我运行app时,它在logcat中显示这个 java.lang.SecurityException:权限拒绝:从ProcessRecord{2dd511f 24656:com.marg.pharmanxt/u0a158}(PID=24656,UID=10158)中启动意图{act=android.Intent.action.call dat=tel:xxxxxxxxxcapt=2dd511f 2

  • IntelliJ Android Studio上次更新(2016年1月30日起)支持Java8吗? 我用了一个lambda表达式 注意:我使用的是最后一个API级别

  • 问题内容: 我有一个带有序列ID的postgres表。 插入通常发生在Web应用程序中。 我手动插入了两个新记录,将id设置为max(id)+1 **** 在这2次插入之后,当Web应用程序插入2条记录时,它会给出重复的键错误。 仅用于2条记录。之后,一切正常。 问题是-为什么我的手动插入没有增加序列号? 自动递增和串行是否不同? 我在这里想念什么?MySQL或任何其他SQL是否存在相同的问题?

  • 问题内容: 我有一个图像URI,我想将此URI转换为真实路径。我看了很多答案,但没有一个对我有用。我正在使用棉花糖6.0.1。图片URI为。 码: 问题答案: A 不是。A 不必代表您可以访问的文件系统上的文件。将可能指向的内容是: 存储在无法访问的可移动存储中 存储在另一个应用程序的内部存储中,您无法访问 以加密形式存储,需要解密时 存储在SQLite数据库的BLOB列中,需要将其加载并提供服务