我在使用下面的代码时遇到了一些麻烦.我有一个临时位置的文件,需要加密,这个功能加密该数据,然后存储在"pathToSave"位置.
在检查时似乎没有正确处理整个文件 - 我的输出中缺少一些内容,我怀疑它与没有在整个流中运行的while循环有关.
顺便说一句,如果我尝试在while循环后调用CryptStrm.Close(),我会收到一个异常.这意味着如果我尝试解密文件,我会得到一个已经在使用的文件错误!
尝试了所有平常和我在这里看到类似的问题,任何帮助都会很棒.
谢谢
public void EncryptFile(String tempPath, String pathToSave)
{
try
{
FileStream InputFile = new FileStream(tempPath, FileMode.Open, FileAccess.Read);
FileStream OutputFile = new FileStream(pathToSave, FileMode.Create, FileAccess.Write);
RijndaelManaged RijCrypto = new RijndaelManaged();
//Key
byte[] Key = new byte[32] { ... };
//Initialisation Vector
byte[] IV = new byte[32] { ... };
RijCrypto.Padding = PaddingMode.None;
RijCrypto.KeySize = 256;
RijCrypto.BlockSize = 256;
RijCrypto.Key = Key;
RijCrypto.IV = IV;
ICryptoTransform Encryptor = RijCrypto.CreateEncryptor(Key, IV);
CryptoStream CryptStrm = new CryptoStream(OutputFile, Encryptor, …Run Code Online (Sandbox Code Playgroud) 在阅读Joshua Bloch的"Effective Java"之后,这个问题得到了提示.特别是在第10项中,他认为解析对象的字符串表示并将其用于除了友好的打印输出/调试之外的任何事情都是不好的做法.原因是这样的使用"容易出错,导致脆弱的系统在您更改格式时会中断".对我而言,看起来Guava Ordering.usingToString()是一个例子.那么使用它是不好的做法吗?
为什么cast在Class<?>Class 上使用该方法会在编译时产生未经检查的警告?
如果你偷看了cast方法,你会发现这个代码:
public T cast(Object obj)
{
if (obj != null && !isInstance(obj))
throw new ClassCastException(cannotCastMsg(obj));
return (T) obj; // you can see there is a generic cast performed here
}
Run Code Online (Sandbox Code Playgroud)
如果我做一个通用演员,编译器抱怨说有unchecked warning.
你可以找到的我如何到达书有效的Java 2版本中这个问题,第166页(的PDF)的例子.
作者写了这段代码
public <T> T getFavorite(Class<T> type)
{
return type.cast(favorites.get(type));
}
Run Code Online (Sandbox Code Playgroud)
VS
public <T> T getFavorite(Class<T> type)
{
return (T) (favorites.get(type));
}
Run Code Online (Sandbox Code Playgroud)
我只是没有得到差异,为什么编译器抱怨未经检查的警告.最后,两段代码都做了一个明确的演员(T) object,不是吗?
在PHP 5.6起default_charset字符串设置"UTF-8"为解释,例如中php.ini的文档.它表示早期版本的字符串为空.
当我创建一个与PHP通信的Java库时,我需要知道在内部处理字符串时我应该期待哪些值.如果default_charset字符串为空并且(文字)字符串包含ASCII范围之外的字符会发生什么?我应该期望平台的默认字符编码,还是用于源文件的字符编码?
我需要加密/解密一些字符串.我根据msdn文档构建了我的包装类,但有一些更改.
由于我想使用给定的字符串/密码来加密/解密数据,因此我不会AesManaged用于创建密钥.(用户应该能够使用他输入的密钥加密/解密,因此我无法使用密钥AesManaged,我无法保存密钥).
我改为通过使用Rfc2898DeriveBytes(PBKDF2)给定盐来创建密钥.使用给定的盐,因为我没有存储密钥,因此我认为盐必须始终相同.
然后我创建一个IV,加密给定的字符串并连接IV和加密的字符串.这将最终保存在文件中.这意味着IV与加密数据一起保存.
问题:
static void Main(string[] args)
{
const string stringToEncrypt = "String to be encrypted/decrypted. Encryption is done via AesManaged";
const string password = "m1Sup3rS3cre!Password";
string encrypted = EncryptString(stringToEncrypt, password);
string roundtrip = DecryptStringFromBytes_Aes(encrypted, password);
Console.WriteLine("Original: {0}", stringToEncrypt);
Console.WriteLine("Round Trip: {0}", roundtrip);
Console.ReadLine();
}
static string EncryptString(string plainText, string password)
{
string encryptedString;
using (AesManaged aesAlg = new AesManaged())
{
aesAlg.Key = PasswordAsByte(password);
ICryptoTransform encryptor …Run Code Online (Sandbox Code Playgroud) 虽然Java Card不推荐使用递归编程风格,但我想对Fibonacci算法进行一些测试.我编写了一个函数来计算Fibonacci的大整数套件(由字节数组表示).
我的代码如下:
public static byte[] fibonacci(byte[] n) {
if (isLEThan1(n)) {
return n;
}
else {
return add(fibonacci(subtract(n, new byte[]{0x01})),fibonacci(subtract(n,new byte[]{0x02})));
}
}
Run Code Online (Sandbox Code Playgroud)
如果字节数组表示的整数小于或等于1,则boolean isLEThan(byte[])返回where,true否则返回false.
byte[] add(byte[], byte[])并对byte[] subtract(byte[], byte[])由字节数组表示的大整数实现加法和减法.它们返回一个包含操作结果的新字节数组.
我认为通过给上面描述的函数提供一个大数组,我将得到一个异常,例如SystemException.NO_RESOURCE由于递归调用而减去实例化的数组.
但我必须认为我没有抓住正确的例外,因为我得到6F00了状态字.
这是我考虑的例外列表:
try {
fibonacci(array);
} catch (ArithmeticException e) {
ISOException.throwIt((short) 0x0100);
} catch (ArrayStoreException e) {
ISOException.throwIt((short) 0x0200);
} catch (APDUException e) {
ISOException.throwIt(Util.makeShort((byte) 0x03,
(byte) e.getReason()));
} catch (CryptoException e) {
ISOException.throwIt(Util.makeShort((byte) 0x04, …Run Code Online (Sandbox Code Playgroud) 我写了一个在磁盘上有19 KB大小的applet.它有三个类.第一个是从Applet扩展的,第二个是静态函数,第三个是我在applet中创建实例的类.
我有三个问题:
如何从 Windows 证书存储库中NCRYPT_KEY_HANDLE的 a 的私钥获取使用 CNG 的加密/解密PCCERT_CONTEXT?
该CryptEncrypt函数已被NCryptEncrypt和BCryptEncrypt函数取代,但没有立即明显的方法PCCERT_CONTEXT从 Windows 证书存储中的a 获取这两个函数中的任何一个的句柄。
甚至可以使用 CNG 功能使用证书(的私钥)进行加密/解密,而无需解析为导出证书之类的蛮力方法?
Javakeytool有一个名为 的参数-keypass,除了用于整个密钥存储的密码之外,它还允许您设置一个(单独的)密码来保护您的私钥。
根据文档:
的值
-keypass是用于保护生成的密钥对的私钥的密码。如果未提供密码,则会提示用户输入密码。如果在提示时按 Return 键,则密钥密码将设置为与密钥库密码相同的密码。该-keypass值必须至少包含六个字符。
但是,当我在调用此命令时省略密码时,我似乎根本没有收到提示,至少在与-genkeypair生成 RSA 密钥对结合使用时没有提示。相反,我只获得一般帮助页面。如果我使用""强制输入“空”密码,那么它(正确地)告诉我密码应至少为 6 个字符。
有没有办法强制提示keytool输入特定于密钥的密码,而不必根据 的文档在命令行上提供它-genkeypair?
我已经针对 Java 11 LTS 对此进行了测试:
keytool -genkeypair -alias test1 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keystore test.pfx -storepass test1234
-keypass
Run Code Online (Sandbox Code Playgroud)
或者
keytool -genkeypair -alias test1 -keyalg RSA -keysize 4096 -sigalg SHA256withRSA -keystore test.pfx -storepass test1234
-keypass ""
Run Code Online (Sandbox Code Playgroud)
两者似乎都不起作用;如您所见,我已经将-keypass参数移到了末尾,因此它无法将参数作为密码吞噬。
如果您现在才开始使用,建议使用什么 RSA 密钥格式?
我知道 PKCS#1 是专用于 RSA 密钥的格式,但我是否需要避免使用它,因为它很旧?
推荐使用的 RSA 密钥格式是 PKCS#1、PKCS#8 或 PKCS#12?