我想加密文件名,但要确保加密的文件名不包含文件名中不允许的任何字符(在Windows系统上)。
该字符串还需要能够被解密回原始文件名(因此您不能在加密后过滤掉无效字符)。
据我所知,不可用的字符是\ /:*? “>< |。我知道System.IO.Path.InvalidPathChars,但我不知道会避免这些字符的加密方法。
答案 0 :(得分:7)
您可以将文件名或加密输出转换为MIME Base64编码。我不相信该标准使用任何禁止的字符。 (即使有,也可以.Replace()
禁止使用非禁止的角色。)
例如,你的问题base64'd是:
c2UgdGhpcyBiYXNlNjQgc2FtcGxlIGRlY29kZXIgYW5kIGVuY29kZXIgdG86DQpGcmVuZCBDemVj aCBsaW5rcw0KDQpMYXN0IG1pbnV0ZSBaYWplemR5DQpBa2NpZSBCaWJsZQ0KTGV2bmUgcG5ldQ0K RmFrdHVyYQ0KU2VhcmNoIEN6ZWNoDQpIcnksIFZ5enZhbmVuaSBuYSBtb2JpbA0KT3RoZXINCg0K ICAgICogRGVjb2RlIGJhc2U2NCBzdHJpbmdzIChiYXNlNjQgc3RyaW5nIGxvb2tzIGxpa2UgWVRN ME5ab21JekkyT1RzbUl6TTBOVHVlWVE9PSkNCiAgICAqIERlY29kZSBhIGJhc2U2NCBlbmNvZGVk IGZpbGUgKGZvciBleGFtcGxlIElDTyBmaWxlcyBvciBmaWxlcyBmcm9tIE1JTUUgbWVzc2FnZSkN CiAgICAqIENvbnZlcnQgc291cmNlIHRleHQgZGF0YSBmcm9tIHNldmVyYWwgY29kZSBwYWdlcyBh bmQgZW5jb2RlIHRoZW0gdG8gYSBiYXNlNjQgc3RyaW5nIG9yIGEgZmlsZQ0KDQoNCiAgICAgIFRo ZSBGb3JtLlNpemVMaW1pdCBpcyAxMDAwMDAwMGJ5dGVzLiBQbGVhc2UsIGRvIG5vdCBwb3N0IG1v cmUgZGF0YSB1c2luZyB0aGlzIGZvcm0uDQoNCiAgICAgVHlwZSAob3IgY29weS1wYXN0ZSkgc29t ZSB0ZXh0IHRvIGEgdGV4dGJveCBiZWxsb3cuIFRoZSB0ZXh0IGNhbiBiZSBCYXNlNjQ =
答案 1 :(得分:4)
正如@Tom所说,你可以对文件名进行base64编码。但是,.NET的base64方法包含斜杠字符,因此您需要替换它。
var encryptedFilename = GetEncryptedFileName();
var encodedFileName = Convert.ToBase64String(Encoding.UTF8.GetBytes(encryptedFilename));
var encodedAndEscapedFilename = encodedFileName.Replace('/', '-');
然后你可以反过来做同样的事情以获得原始名称(使用Convert.FromBase64String
和Encoding.UTF8.GetString
)。
答案 2 :(得分:3)
没有产生'字符串',所有加密转换都会导致byte []不在字符串中。有字节表示的byte [],就像众所周知的十六进制(0xBAADF00D)或Base64一样。可能base64最合适,只需使用Convert.ToBase64String
和Convert.FromBase64String
。
据说加密文件名似乎是一个非常糟糕的主意。文件名按定义索引查找键,加密后您将失去任何查找功能。您必须扫描整个磁盘/文件夹并解密每个文件名,以找出您想要的文件。请注意,您不能依赖已知的加密值(例如,如果我寻求'file.txt'我加密'file.txt'然后搜索加密名称),因为加密必须使用随机IV值(它附加到加密结果中)。未能正确随机化IV将导致cribs。然而成功腌制关键(良好的随机IV)将使结果无法搜索。
答案 3 :(得分:1)
正如Remus所述,没有产生“字符串”,所有加密转换都会导致byte []不在字符串中。
我通常采用加密输出字节数组,并调用BitConverter.ToString(Bytes);
将其转换为十六进制,但这会导致FF-D0-FF-D1格式。如果需要普通的十六进制字符串,只需运行.Replace("-", "");
e.g。
返回 BitConverter.ToString(AESEncryption.Encrypt(令牌,
key)).Replace("-", "");
(AESEncryption是一个围绕RijndaelManaged的简单定制包装器)
解密不是那么整洁,有点蛮力,但仍然很简单
private byte[] FromHexString(string encryptedToken)
{
List<byte> bytes = new List<byte>();
for (int i = 0; i <= encryptedToken.Length; i+=2)
{
try
{
bytes.Add((byte)Int32.Parse(encryptedToken.Substring(i, 2), System.Globalization.NumberStyles.HexNumber));
}
catch //whatever exception
{
//handle
}
}
return bytes.ToArray();
}
答案 4 :(得分:1)
我的回答是将加密代码转换为HEX。这样做的好处是兼容ASP,ASPX,SQL,VB,C#和Javascript。另一个好处是我可以使用我选择的加密而不用担心输出。