Tag: 密码学

如何解密从Mifare Desfire EV1发送的第一条消息

有没有人知道如何解密从卡发送的第一条消息? 我的意思是在身份validation成功后然后你发送一个命令(例如0x51(GetRealTagUID)。它返回00 + random32bits(总是不同)。我尝试解密它: private byte[] decrypt(byte[] raw, byte[] encrypted, byte[] iv) throws Exception { IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); SecretKeySpec skeySpec = new SecretKeySpec(raw, “AES”); Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivParameterSpec); byte[] decrypted = cipher.doFinal(encrypted); return decrypted; } 用decrypt调用它(sessionKey,response,iv) IV =全零(16字节) 响应= 0x51命令后的32randombits(刚刚删除了两个零) 有人告诉我,第一次发送命令(0x51)后IV发生了变化。 如何生成正确的IV来解密该响应? 我认为全零是错误的,因为解密的消息总是不同的,并且它应该始终与同一张卡相同。 -编辑- 在应用您的(Michael Roland)指令后,解密的响应仍然只是随机位。 这是我的代码(我想我做错了): byte[] x = […]

我该如何生成初始化向量?

我确信这个问题没有一个答案,只是试图找出一个通用的方法。 使用Java 1.4.2,我需要生成一个密钥和IV,用于对称算法。 这些值将通过安全通道与收件人预先共享。 我可以使用KeyGenerator.keyGenerate()生成密钥。 但除非我错过它,否则没有生成随机IV的function。 我应该做一些完全随意的事情,比如从内存中拉出16个随机字节 或者是否有一种产生足够随机初始化向量的首选方法?

如何将String转换为PublicKey?

我使用以下代码将公钥和私钥转换为字符串 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(“RSA”); keyPairGen.initialize(2048); KeyPair keyPair = keyPairGen.genKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); String publicK = Base64.encodeBase64String(publicKey.getEncoded()); String privateK = Base64.encodeBase64String(privateKey.getEncoded()); 现在我正在尝试将其转换回公共广告私钥 PublicKey publicDecoded = Base64.decodeBase64(publicK); 我收到错误,无法从byte []转换为公钥。 所以我试过这样的 PublicKey publicDecoded = new SecretKeySpec(Base64.decodeBase64(publicK),”RSA”); 这会导致如下错误 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: Neither a public nor a private key 看起来我在这里做了错误的密钥转换。 任何帮助,将不胜感激。

如何在java加密中将位插入块中?

我正在尝试制作一个涉及加密的简单Java程序。 首先,我从文件clearmsg.txt中读取一个32字节的块。 然后我将此块转换为整数,并将其用于加密。 不幸的是,密文的大小不是静态的; 有时它返回30个字节,有时返回26个字节。 这似乎与添加操作的结果无关。 如何确保它成为32字节的密码块? 如何向这个块添加位/字节? 因为当我尝试解密这个块时,我需要读取32个密文字节。 private void ENC_add() { final File clearmsg = new File(“F:/java_projects/clearmsg.txt”); final File ciphermsg = new File(“F:/java_projects/ciphermsg.txt”); final byte[] block = new byte[32]; try { final FileInputStream fis = new FileInputStream(clearmsg); final FileOutputStream fcs = new FileOutputStream(ciphermsg); int i; while ((i = fis.read(block)) != -1) { // […]

Java与Golang for HOTP(rfc-4226)

我正在尝试在Golang中实现HOTP(rfc-4226),我正在努力生成有效的HOTP。 我可以在java中生成它但由于某种原因我在Golang中的实现是不同的。 以下是样本: public static String constructOTP(final Long counter, final String key) throws NoSuchAlgorithmException, DecoderException, InvalidKeyException { final Mac mac = Mac.getInstance(“HmacSHA512”); final byte[] binaryKey = Hex.decodeHex(key.toCharArray()); mac.init(new SecretKeySpec(binaryKey, “HmacSHA512”)); final byte[] b = ByteBuffer.allocate(8).putLong(counter).array(); byte[] computedOtp = mac.doFinal(b); return new String(Hex.encodeHex(computedOtp)); } 在Go: func getOTP(counter uint64, key string) string { str, err := hex.DecodeString(key) […]

PBEWithMD5AndTripleDES的密钥大小是多少?

我试图用现有代码中的PBEWithMD5AndTripleDES替换PBEWithMD5AndDES。 到目前为止,我使用的是我之前使用的相同密码,并收到此exception: java.security.InvalidKeyException:非法密钥大小 我在网上查看,看到DES使用64位密钥,而TripleDES使用128位密钥。 我不清楚我的密码短语如何用于生成密钥的细节,并且不确定在哪里完全理解这一点。 我的密码长度为260个字符。 我尝试加倍长度,但我得到了同样的例外。 我从我的密码生成一个PBEKeySpec,有一个8字节的盐和12的迭代次数。我看到有另一个构造函数接受了一个keyLength参数,但文档将其描述为“要派生”,而我不是明白。 我有一个想法,我需要修改迭代计数和/或提供一个keyLength参数,但我不想盲目地这样做而不完全理解我在做什么。 以下是我目前使用的代码的基本概要: String passphrase = … byte[] salt = … int iterationCount = 12; String algorithm = “PBEWithMD5AndTripleDES”; KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), salt, iterationCount); SecretKey key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec); Cipher cipher = Cipher.getInstance(key.getAlgorithm()); AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount); cipher.init(Cipher.ENCRYPT_MODE, key, paramSpec); byte[] encoded = cipher.doFinal(data);

当Decrypting Image时,给出了javax.crypto.BadPaddingException:pad块损坏的Android

嗨,我是Android和图像加密的新手。 我的情况是这样的, 首先,我正在加密图像文件。 然后我将它上传到服务器 从我的应用程序我下载加密图像并将其保存在SD卡中。 然后我在将它设置为imageView之前解密它 (请参阅我已经使用的所有需要​​方法的底部..) 但我得到javax.crypto.BadPaddingException:解密时pad块损坏。 我读了一些关于这个例外的文章,但都是关于文本加密的。 你能帮我避免这个吗? 先感谢您 Image Encrption使用… private 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; } 在这里我也保存了其他几张图片,所有图像都成功保存在SD卡中… for (int i = 0; i < imageUrls.size(); i++) { File file = […]

无法在Android应用程序中解密String

我正在尝试开发一个可以加密和解密值的android应用程序。 所以我按照这个链接在这里输入链接描述 到目前为止,我能够加密文本,但我无法解密它。 在我的代码中,我使用了相同的AESHelper类,该类在提供的链接中提到。 以下是我用来加密和解密值的活动类 import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends ActionBarActivity { EditText text ; TextView encp,decriptom; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (EditText) findViewById(R.id.editText); encp = (TextView) findViewById(R.id.valueexcript); decriptom = (TextView) findViewById(R.id.deexcript); } @Override public […]

SecureRandom:init需要一次还是每次需要?

我们的团队使用SecureRandom生成密钥对列表(SecureRandom传递给KeyPairGenerator)。 我们无法就以下两个选项中的哪一个达成一致: 每次我们需要生成密钥对时创建一个新实例 初始化静态实例并将其用于所有密钥对 哪种方法通常更好, 为什么 ? 补充:我的直觉是第二种选择更安全。 但我唯一的论点是基于假设伪随机性是从当前时间戳得出的理论攻击:有人可能会看到密钥对的创建时间,猜测周围时间间隔内的时间戳,计算可能的伪随机序列,并获得关键材料。 补充:我对基于时间戳的确定性的假设是错误的。 这是Random和SecureRandom之间的区别。 因此,看起来答案是:就安全性而言,它并不重要。

使用RSA可以加密的数据量有多少限制?

通常,建议使用RSA加密对称密钥,然后将其用于加密“有效负载”。 对于可以使用RSA加密的数据量的实际(或理论)限制是什么(我使用的是2048位RSA密钥大小)。 特别是,我想知道使用(不同的)RSA公钥加密RSA公钥(256字节)是否安全? 我在Java中使用Bouncy Castle加密库。