我想在 Swift 中将 aes-128-ctr 与 CryptoSwift 库一起使用,但是我生成的密文太长了。
我的IV是16字节,salt是32字节,aes明文也是32字节,为什么生成的密文是48字节,还要补16字节?
let salt: [UInt8] = Array("tkmlidnonknkqgvapjrpdcductebsozn".utf8)
let derivedKey = try PKCS5.PBKDF2(password: password, salt: salt, iterations: numberOfIterations, variant: .sha256).calculate()
let iv: [UInt8] = Array("abcdefgthksdfghj".utf8)
let aesKey: [UInt8] = Array(derivedKey[..<16])
let aes = try AES(key: aesKey, blockMode: .CTR(iv: iv))
let ciphertext = try aes.encrypt(password)
这里的密码就是上面提到的32字节明文。
另外,有什么方法可以生成随机盐吗?我发现
let iv: [UInt8] = AES.randomIV(AES.blockSize)
生成随机 IV,但是我如何获得这样的盐?
最佳答案
根据CryptoSwift documentation , 它默认使用 PKCS7 填充。由于 CTR 模式不需要填充,您可以(并且应该)通过添加 padding: .noPadding 来禁用它给你的AES()构造函数调用。
PBKDF2 salt 没有特殊的格式要求(它可以是任何随机字节串),所以你应该可以使用 AES.randomIV() (或任何其他随机字节源)生成一个。
( Internally ,CryptoSwift AES.randomIV() 代码似乎使用了 RandomBytesSequence ,但不幸的是,CryptoSwitf 的那部分似乎没有记录。除了 randomIV() 源代码之外,我能找到的唯一用法示例本身,是 this test case 。顺便说一句,这看起来像一个非常糟糕的单元测试 - 它似乎正在测试的是 AnyIterator<UInt8> 实际上返回 UInt8 值。它甚至没有检查迭代器是否实际返回请求的数字字节数,它可能完全无法做到,例如,如果打开 /dev/urandom 由于某种原因失败。)
关于Swift - AES 128 ctr,密文太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46993909/
我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
我在Rails中有一个具有以下方法的应用程序,该方法可以加密和解密文本并与Java客户端通信。defencrypt(string,key)cipher=OpenSSL::Cipher::AES.new(128,:CBC)cipher.encryptcipher.padding=1cipher.key=hex_to_bin(Digest::SHA1.hexdigest(key)[0..32])cipher_text=cipher.update(string)cipher_textexcenddefhex_to_bin(str)[str].pack"H*"enddefbin_to_hex(
如果使用rspec请求花费的时间太长,我该如何测试行为?我正在考虑使用线程来模拟这个:describe"Test"doit"shouldtimeoutiftherequesttakestoolong"dolambda{thread1=Thread.new{#net::httprequesttogoogle.com}thread2=Thread.new{sleep(xxseconds)}thread1.jointhread2.join}.shouldraise_errorendend我想确保在第一次发出请求后,另一个线程“启动”,在这种情况下只是休眠xx秒。然后我应该期望请求超时,因为执
我收到错误:unsupportedcipheralgorithm(AES-256-GCM)(RuntimeError)但我似乎具备所有要求:ruby版本:$ruby--versionruby2.1.2p95OpenSSL会列出gcm:$opensslenc-help2>&1|grepgcm-aes-128-ecb-aes-128-gcm-aes-128-ofb-aes-192-ecb-aes-192-gcm-aes-192-ofb-aes-256-ecb-aes-256-gcm-aes-256-ofbRuby解释器:$irb2.1.2:001>require'openssl';puts
我有一段代码,其中有一个带有保护子句的raise语句:defvalidate_indexindex#ChangetoSizeErrorraiseArgumentError,"Sizeofindex(#{index.size})doesnotmatches"\"sizeofvector(#{size})"ifsize!=index.sizeend在这一点上,rubocop给出了罪行:Style/MultilineIfModifier:Favoranormalif-statementoveramodifierclauseinamultilinestatement.我将我的代码修改为正常if
我正在尝试在Ruby中实现aes-128-ccm加密字符串的SJCL解密。看完了similarquestion我看到这应该在较新版本的OpenSSL库中得到支持,所以我已经将开发版本从github安装到/opt执行此操作后,当我运行/opt/bin/opensslciphers时,我没有在列表中看到aes-128-ccm密码:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECD
我可以像这样用Ruby解密AES加密消息:require'openssl'require'base64'data="IYkyGxYaNgHpnZWgwILMalVFmLWFgTCHCZL9263NOcfSo5lBjAzOZAtF5bF++R0Bi+9c9E+p3VEr/xvj4oABtRWVJ2wlWzLbYC2rKFk5iapFhb7uZCUpO4w4Su3a5QFa2vInjYueziRoqySZd/DpstMJ8rsJ94VGizFFFZ1l0sw1ax+wfBAv5+wHs/hlnHi/ea66KBO3rgXKahvV28h+4bh5etc8RCrmiiNbfg6Oj0jQJD
我刚刚将RuboCop添加到一个Rails项目并安装了Sublime包以在编辑器中查看RuboCop建议。我想弄清楚如何将最大行长度从80个字符更改为80个字符,或者完全忽略该规则。目前正在使用:RuboCop(gem)SublimeRuboCopSublimeLinter-rubocop 最佳答案 在您的代码中,您可以像这样禁用一堆行:#rubocop:disableLayout/LineLengthputs"Thislineislonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
我在Windows10上使用IE11成功地使用AES-GCM加密了一些数据,但我无法进行解密。示例加密JS代码:letplainText=newUint8Array([1]);letkey;letkeyBuf=window.msCrypto.getRandomValues(newUint8Array(32));letiv=window.msCrypto.getRandomValues(newUint8Array(12));letadditionalData=window.msCrypto.getRandomValues(newUint8Array(16));letencResult;l