Прием должен использовать MemoryStream.ToArray()
. Я также изменил Ваш код так, чтобы он использовал CryptoStream
для Записи, и в шифровании и в дешифровании. И Вы не должны звонить CryptoStream.FlushFinalBlock()
явно, потому что у Вас есть он в using()
оператор, и тот сброс произойдет на Dispose()
. Следующие работы для меня.
byte[] rawPlaintext = System.Text.Encoding.Unicode.GetBytes("This is all clear now!");
using (Aes aes = new AesManaged())
{
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = 128; // in bits
aes.Key = new byte[128/8]; // 16 bytes for 128 bit encryption
aes.IV = new byte[128/8]; // AES needs a 16-byte IV
// Should set Key and IV here. Good approach: derive them from
// a password via Cryptography.Rfc2898DeriveBytes
byte[] cipherText= null;
byte[] plainText= null;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(rawPlaintext, 0, rawPlaintext.Length);
}
cipherText= ms.ToArray();
}
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherText, 0, cipherText.Length);
}
plainText = ms.ToArray();
}
string s = System.Text.Encoding.Unicode.GetString(plainText);
Console.WriteLine(s);
}
кроме того, я предполагаю, что Вы знаете, что захотите явно установить Режим из экземпляра AesManaged и использование Система. Безопасность. Криптография. Rfc2898DeriveBytes для получения Ключа и IV от пароля и соли.
см. также:
- AesManaged
Поскольку у вас есть GeoRuby, добавьте свою модель Poi
SRID = 4326 #WGS84
# geometry column is geom
# pt is a GeoRuby Point
def self.find_within_radius(pt, dist = 0.01)
self.all :conditions => "ST_DWithin(geom, ST_GeomFromText('POINT(#{pt.x} #{pt.y})', #{SRID}), #{dist})"
end
Для вычисления расстояния вы можете использовать методы для точечных объектов
dist_circle = poi1.geom.spherical_distance(poi2.geom)
dist_projected = poi1.geom.euclidean_distance(poi2.geom)