Spec-Zone.ru › D

std.digest.sha

Вычисляет хеши SHA1 и SHA2 произвольных данных. Хеши SHA — это значения от 20 до 64 байтов (в зависимости от алгоритма SHA), которые похожи на контрольную сумму или CRC, но более надёжны.

Категория Функции
API шаблонов SHA1
API объектов SHA1Digest
Справочные функции sha1Of

SHA2 представлен в нескольких версиях, все они поддерживаются этим модулем: SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 и SHA-512/256.

Этот модуль соответствует API, определённым в std.digest. Чтобы понять различия между API шаблонов и API объектов, см. std.digest.

Этот модуль открыто импортирует std.digest и может использоваться как самостоятельный модуль.

Лицензия:
Лицензия Boost 1.0.
CTFE
Хеширование не работает в CTFE
Авторы:
Процедуры и алгоритмы взяты из Secure Hash Signature Standard (SHS) (FIPS PUB 180-2).
Kai Nacke, Johannes Pfau, Nick Sabalausky
Ссылки
  • FIPS PUB180-2
  • Быстрая реализация SHA1
  • Статья Википедии о SHA
Исходный код
std/digest/sha.d
Примеры:
//Template API
import std.digest.sha;

ubyte[20] hash1 = sha1Of("abc");
writeln(toHexString(hash1)); // "A9993E364706816ABA3E25717850C26C9CD0D89D"

ubyte[28] hash224 = sha224Of("abc");
writeln(toHexString(hash224)); // "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7"

//Feeding data
ubyte[1024] data;
SHA1 sha1;
sha1.start();
sha1.put(data[]);
sha1.start(); //Start again
sha1.put(data[]);
hash1 = sha1.finish();
Примеры:
//OOP API
import std.digest.sha;

auto sha1 = new SHA1Digest();
ubyte[] hash1 = sha1.digest("abc");
writeln(toHexString(hash1)); // "A9993E364706816ABA3E25717850C26C9CD0D89D"

auto sha224 = new SHA224Digest();
ubyte[] hash224 = sha224.digest("abc");
writeln(toHexString(hash224)); // "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7"

//Feeding data
ubyte[1024] data;
sha1.put(data[]);
sha1.reset(); //Start again
sha1.put(data[]);
hash1 = sha1.finish();
struct SHA(uint hashBlockSize, uint digestSize);

Реализация SHA1/SHA2 с использованием шаблонов. Поддерживает: SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224 и SHA-512/256.

hashBlockSize и digestSize задаются в битах. Однако проще использовать удобные псевдонимы: SHA1, SHA224, SHA256, SHA384, SHA512, SHA512_224 и SHA512_256.

Различия между API шаблонов и API объектов см. в std.digest.

Примеры:
//Simple example, hashing a string using sha1Of helper function
ubyte[20] hash = sha1Of("abc");
//Let's get a hash string
writeln(toHexString(hash)); // "A9993E364706816ABA3E25717850C26C9CD0D89D"

//The same, but using SHA-224
ubyte[28] hash224 = sha224Of("abc");
writeln(toHexString(hash224)); // "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7"
Примеры:
//Using the basic API
SHA1 hash;
hash.start();
ubyte[1024] data;
//Initialize data here...
hash.put(data);
ubyte[20] result = hash.finish();
Примеры:
//Let's use the template features:
//Note: When passing a SHA1 to a function, it must be passed by reference!
void doSomething(T)(ref T hash)
if (isDigest!T)
{
  hash.put(cast(ubyte) 0);
}
SHA1 sha;
sha.start();
doSomething(sha);
writeln(toHexString(sha.finish())); // "5BA93C9DB0CFF93F52B521D7420E43F6EDA2784F"
pure nothrow @nogc @safe void start();

Инициализация SHA. Начинает операцию SHA1/SHA2.

Примечание
Для этой реализации SHA Digest вызов start после конструктора по умолчанию не требуется. Вызов start необходим только для сброса Digest.
В общем случае код, работающий с различными типами Digest, должен вызывать start.
Пример
SHA1 digest;
//digest.start(); //Not necessary
digest.put(0);
pure nothrow @nogc @trusted void put(scope const(ubyte)[] input...);

Используйте этот метод для подачи данных в хэширование. Также реализует интерфейс std.range.primitives.isOutputRange для ubyte и const(ubyte)[].

pure nothrow @nogc @trusted ubyte[digestSize / 8] finish();

Возвращает готовый хеш SHA. Также вызывает start для сброса внутреннего состояния.

Примеры:
//Simple example
SHA1 hash;
hash.start();
hash.put(cast(ubyte) 0);
ubyte[20] result = hash.finish();
alias SHA1 = SHA!(512u, 160u).SHA;

Псевдоним SHA для SHA-1, хеш — ubyte[20]

alias SHA224 = SHA!(512u, 224u).SHA;

Псевдоним SHA для SHA-224, хеш — ubyte[28]

alias SHA256 = SHA!(512u, 256u).SHA;

Псевдоним SHA для SHA-256, хеш — ubyte[32]

alias SHA384 = SHA!(1024u, 384u).SHA;

Псевдоним SHA для SHA-384, хеш — ubyte[48]

alias SHA512 = SHA!(1024u, 512u).SHA;

Псевдоним SHA для SHA-512, хеш — ubyte[64]

alias SHA512_224 = SHA!(1024u, 224u).SHA;

Псевдоним SHA для SHA-512/224, хеш — ubyte[28]

alias SHA512_256 = SHA!(1024u, 256u).SHA;

Псевдоним SHA для SHA-512/256, хеш — ubyte[32]

auto sha1Of(T...)(T data);

auto sha224Of(T...)(T data);

auto sha256Of(T...)(T data);

auto sha384Of(T...)(T data);

auto sha512Of(T...)(T data);

auto sha512_224Of(T...)(T data);

auto sha512_256Of(T...)(T data);

Это удобные псевдонимы для std.digest.digest с использованием реализации SHA.

Примеры:
ubyte[20] hash = sha1Of("abc");
writeln(hash); // digest!SHA1("abc")

ubyte[28] hash224 = sha224Of("abc");
writeln(hash224); // digest!SHA224("abc")

ubyte[32] hash256 = sha256Of("abc");
writeln(hash256); // digest!SHA256("abc")

ubyte[48] hash384 = sha384Of("abc");
writeln(hash384); // digest!SHA384("abc")

ubyte[64] hash512 = sha512Of("abc");
writeln(hash512); // digest!SHA512("abc")

ubyte[28] hash512_224 = sha512_224Of("abc");
writeln(hash512_224); // digest!SHA512_224("abc")

ubyte[32] hash512_256 = sha512_256Of("abc");
writeln(hash512_256); // digest!SHA512_256("abc")
alias SHA1Digest = std.digest.WrapperDigest!(SHA!(512u, 160u)).WrapperDigest;

alias SHA224Digest = std.digest.WrapperDigest!(SHA!(512u, 224u)).WrapperDigest;

alias SHA256Digest = std.digest.WrapperDigest!(SHA!(512u, 256u)).WrapperDigest;

alias SHA384Digest = std.digest.WrapperDigest!(SHA!(1024u, 384u)).WrapperDigest;

alias SHA512Digest = std.digest.WrapperDigest!(SHA!(1024u, 512u)).WrapperDigest;

alias SHA512_224Digest = std.digest.WrapperDigest!(SHA!(1024u, 224u)).WrapperDigest;

alias SHA512_256Digest = std.digest.WrapperDigest!(SHA!(1024u, 256u)).WrapperDigest;

Реализация SHA1 и SHA2 с использованием API объектов. Различия между API шаблонов и API объектов см. в std.digest.

Это псевдоним для std.digest.WrapperDigest!SHA1, см. там более подробную информацию.

Примеры:
//Simple example, hashing a string using Digest.digest helper function
auto sha = new SHA1Digest();
ubyte[] hash = sha.digest("abc");
//Let's get a hash string
writeln(toHexString(hash)); // "A9993E364706816ABA3E25717850C26C9CD0D89D"

//The same, but using SHA-224
auto sha224 = new SHA224Digest();
ubyte[] hash224 = sha224.digest("abc");
//Let's get a hash string
writeln(toHexString(hash224)); // "23097D223405D8228642A477BDA255B32AADBCE4BDA0B3F7E36C9DA7"
Примеры:
//Let's use the OOP features:
void test(Digest dig)
{
  dig.put(cast(ubyte) 0);
}
auto sha = new SHA1Digest();
test(sha);

//Let's use a custom buffer:
ubyte[20] buf;
ubyte[] result = sha.finish(buf[]);
writeln(toHexString(result)); // "5BA93C9DB0CFF93F52B521D7420E43F6EDA2784F"

© 1999–2021 The D Language Foundation
Licensed under the Boost License 1.0.
https://dlang.org/phobos/std_digest_sha.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API