HMACSHA384 コンストラクタとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > HMACSHA384 コンストラクタの意味・解説 

HMACSHA384 コンストラクタ (Byte[])

メモ : このコンストラクタは、.NET Framework version 2.0新しく追加されたものです。

キー データ指定してHMACSHA384 クラス新しインスタンス初期化します。

名前空間: System.Security.Cryptography
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

例外例外
例外種類条件

ArgumentNullException

key パラメータnull 参照 (Visual Basic では Nothing) です。

解説解説
使用例使用例

HMACSHA384使用してファイルエンコードしたり、エンコード済みファイルデコードしたりする方法次のコード例示します

using System;
using System.IO;
using System.Security.Cryptography;

public class HMACSHA384example
{
    // Computes a keyed hash for a source file, creates a target file
 with the keyed hash
    // prepended to the contents of the source file, then decrypts the
 file and compares
    // the source and the decrypted files.
    public static void EncodeFile(byte[]
 key, String sourceFile, String destFile)
    {
        // Initialize the keyed hash object.
        HMACSHA384 myhmacsha384 = new HMACSHA384(key);
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);
        FileStream outStream = new FileStream(destFile, FileMode.Create);
        // Compute the hash of the input file.
        byte[] hashValue = myhmacsha384.ComputeHash(inStream);
        // Reset inStream to the beginning of the file.
        inStream.Position = 0;
        // Write the computed hash value to the output file.
        outStream.Write(hashValue, 0, hashValue.Length);
        // Copy the contents of the sourceFile to the destFile.
        int bytesRead;
        // read 1K at a time
        byte[] buffer = new byte[1024]; 
        do
        {
            // Read from the wrapping CryptoStream.
            bytesRead = inStream.Read(buffer,0,1024); 
            outStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0); 
        myhmacsha384.Clear();
        // Close the streams
        inStream.Close();
        outStream.Close();
        return;
    } // end EncodeFile


    // Decrypt the encoded file and compare to original file.
    public static bool DecodeFile(byte[]
 key, String sourceFile)
    {
        // Initialize the keyed hash object. 
        HMACSHA384 hmacsha384 = new HMACSHA384(key);
        // Create an array to hold the keyed hash value read from the
 file.
        byte[] storedHash = new byte[hmacsha384.HashSize/8];
        // Create a FileStream for the source file.
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);
        // Read in the storedHash.
        inStream.Read(storedHash, 0, storedHash.Length);
        // Compute the hash of the remaining contents of the file.
        // The stream is properly positioned at the beginning of the
 content, 
        // immediately after the stored hash value.
        byte[] computedHash = hmacsha384.ComputeHash(inStream);
        // compare the computed hash with the stored value
        for (int i =0; i < storedHash.Length;
 i++)
        {
            if (computedHash[i] != storedHash[i])
            {
                Console.WriteLine("Hash values differ! Encoded file has been
 tampered with!");
                return false;
            }
        }
        Console.WriteLine("Hash values agree -- no tampering occurred.");
        return true;
    } //end DecodeFile

    private const string
 usageText = "Usage: HMACSHA384 inputfile.txt encryptedfile.hsh\nYou must specify
 the two file names. Only the first file must exist.\n";
    public static void Main(string[]
 Fileargs)
    {
        //If no file names are specified, write usage text.
        if (Fileargs.Length < 2)
        {
            Console.WriteLine(usageText);
        }
        else
        {
            try
            {
                // Create a random key using a random number generator.
 This would be the
                //  secret key shared by sender and receiver.
                byte[] secretkey = new Byte[64];
                //RNGCryptoServiceProvider is an implementation of a
 random number generator.
                RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
                // The array is now filled with cryptographically strong
 random bytes.
                rng.GetBytes(secretkey); 

                // Use the secret key to encode the message file.
                EncodeFile(secretkey, Fileargs[0], Fileargs[1]);

                // Take the encoded file and decode
                DecodeFile(secretkey, Fileargs[1]);
            }
            catch (IOException e)
            {
                Console.WriteLine("Error: File not found",e);
            }
        } //end if-else

    }  //end main
} //end class
using namespace System;
using namespace System::IO;
using namespace System::Security::Cryptography;

// Computes a keyed hash for a source file, creates a target file with
 the keyed hash
// prepended to the contents of the source file, then decrypts the file
 and compares
// the source and the decrypted files.
void EncodeFile( array<Byte>^key, String^ sourceFile, String^
 destFile )
{
   
   // Initialize the keyed hash object.
   HMACSHA384^ myhmacsha384 = gcnew HMACSHA384( key );
   FileStream^ inStream = gcnew FileStream( sourceFile,FileMode::Open );
   FileStream^ outStream = gcnew FileStream( destFile,FileMode::Create );
   
   // Compute the hash of the input file.
   array<Byte>^hashValue = myhmacsha384->ComputeHash( inStream );
   
   // Reset inStream to the beginning of the file.
   inStream->Position = 0;
   
   // Write the computed hash value to the output file.
   outStream->Write( hashValue, 0, hashValue->Length );
   
   // Copy the contents of the sourceFile to the destFile.
   int bytesRead;
   
   // read 1K at a time
   array<Byte>^buffer = gcnew array<Byte>(1024);
   do
   {
      
      // Read from the wrapping CryptoStream.
      bytesRead = inStream->Read( buffer, 0, 1024 );
      outStream->Write( buffer, 0, bytesRead );
   }
   while ( bytesRead > 0 );

   myhmacsha384->Clear();
   
   // Close the streams
   inStream->Close();
   outStream->Close();
   return;
} // end EncodeFile



// Decrypt the encoded file and compare to original file.
bool DecodeFile( array<Byte>^key, String^ sourceFile )
{
   
   // Initialize the keyed hash object. 
   HMACSHA384^ hmacsha384 = gcnew HMACSHA384( key );
   
   // Create an array to hold the keyed hash value read from the file.
   array<Byte>^storedHash = gcnew array<Byte>(hmacsha384->HashSize
 / 8);
   
   // Create a FileStream for the source file.
   FileStream^ inStream = gcnew FileStream( sourceFile,FileMode::Open );
   
   // Read in the storedHash.
   inStream->Read( storedHash, 0, storedHash->Length );
   
   // Compute the hash of the remaining contents of the file.
   // The stream is properly positioned at the beginning of the content,
 
   // immediately after the stored hash value.
   array<Byte>^computedHash = hmacsha384->ComputeHash( inStream );
   
   // compare the computed hash with the stored value
   for ( int i = 0; i < storedHash->Length;
 i++ )
   {
      if ( computedHash[ i ] != storedHash[ i ] )
      {
         Console::WriteLine( "Hash values differ! Encoded file has been tampered
 with!" );
         return false;
      }

   }
   Console::WriteLine( "Hash values agree -- no tampering occurred." );
   return true;
} //end DecodeFile


int main()
{
   array<String^>^Fileargs = Environment::GetCommandLineArgs();
   String^ usageText = "Usage: HMACSHA384 inputfile.txt encryptedfile.hsh\nYou
 must specify the two file names. Only the first file must exist.\n";
   
   //If no file names are specified, write usage text.
   if ( Fileargs->Length < 3 )
   {
      Console::WriteLine( usageText );
   }
   else
   {
      try
      {
         
         // Create a random key using a random number generator. This
 would be the
         //  secret key shared by sender and receiver.
         array<Byte>^secretkey = gcnew array<Byte>(64);
         
         //RNGCryptoServiceProvider is an implementation of a random
 number generator.
         RNGCryptoServiceProvider^ rng = gcnew RNGCryptoServiceProvider;
         
         // The array is now filled with cryptographically strong random
 bytes.
         rng->GetBytes( secretkey );
         
         // Use the secret key to encode the message file.
         EncodeFile( secretkey, Fileargs[ 1 ], Fileargs[ 2 ] );
         
         // Take the encoded file and decode
         DecodeFile( secretkey, Fileargs[ 2 ] );
      }
      catch ( IOException^ e ) 
      {
         Console::WriteLine( "Error: File not found", e );
      }

   }
} //end main


import System.*;
import System.IO.*;
import System.Security.Cryptography.*;

public class HMACSHA384Example
{
    // Computes a keyed hash for a source file, creates a target file
 with 
    // the keyed hash prepended to the contents of the source file,
 then 
    // decrypts the file and compares the source and the decrypted files.
    public static void EncodeFile(ubyte
 key[], String sourceFile, 
        String destFile)
    {
        // Initialize the keyed hash object.
        HMACSHA384 myhmacsha384 = new HMACSHA384(key);
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);
        FileStream outStream = new FileStream(destFile, FileMode.Create);

        // Compute the hash of the input file.
        ubyte hashValue[] = myhmacsha384.ComputeHash(inStream);

        // Reset inStream to the beginning of the file.
        inStream.set_Position(0);

        // Write the computed hash value to the output file.
        outStream.Write(hashValue, 0, hashValue.length);

        // Copy the contents of the sourceFile to the destFile.
        int bytesRead;

        // read 1K at a time
        ubyte buffer[] = new ubyte[1024];

        do {
            // Read from the wrapping CryptoStream.
            bytesRead = inStream.Read(buffer, 0, 1024);
            outStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0);
        myhmacsha384.Clear();

        // Close the streams
        inStream.Close();
        outStream.Close();
        return;
    } // end EncodeFile
    
    // Decrypt the encoded file and compare to original file.
    public static boolean DecodeFile(ubyte
 key [], String sourceFile)
    {
        // Initialize the keyed hash object. 
        HMACSHA384 hmacsha384 = new HMACSHA384(key);

        // Create an array to hold the keyed hash value read from the
 file.
        ubyte storedHash[] = new ubyte[hmacsha384.get_HashSize()
 / 8];

        // Create a FileStream for the source file.
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);

        // Read in the storedHash.
        inStream.Read(storedHash, 0, storedHash.length);

        // Compute the hash of the remaining contents of the file.
        // The stream is properly positioned at the beginning of the
 content, 
        // immediately after the stored hash value.
        ubyte computedHash[] = hmacsha384.ComputeHash(inStream);

        // compare the computed hash with the stored value
        for (int i = 0; i < storedHash.length;
 i++) {
            if (computedHash[i] != storedHash[i]) {
                Console.WriteLine("Hash values differ! Encoded file has been
 " 
                    + " tampered with!");
                return false;
            }
        }

        Console.WriteLine("Hash values agree -- no tampering occurred.");
        return true;
    } //end DecodeFile

    private static String usageText = "Usage:
 HMACSHA384 inputfile.txt " 
        + "encryptedfile.hsh\nYou must specify the two file names. Only the
 " 
        + "first file must exist.\n";

    public static void main(String[]
 fileargs)
    {
        //If no file names are specified, write usage text.
        if (fileargs.length < 2) {
            Console.WriteLine(usageText);
        }
        else {
            try {
                // Create a random key using a random number generator.
 This 
                // would be the secret key shared by sender and receiver.
                ubyte secretKey[] = new ubyte[64];

                // RNGCryptoServiceProvider is an implementation of
 a random
                // number generator.
                RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

                // The array is now filled with cryptographically strong
                // random bytes.
                rng.GetBytes(secretKey);

                // Use the secret key to encode the message file.
                EncodeFile(secretKey, fileargs[0], fileargs[1]);

                // Take the encoded file and decode
                DecodeFile(secretKey, fileargs[1]);
            }
            catch (IOException e) {
                Console.WriteLine("Error: File not found", e);
            }
        } //end if-else
    } //end main
} //end class HMACSHA384Example
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照

HMACSHA384 コンストラクタ

HMACSHA384 クラス新しインスタンス初期化します。
オーバーロードの一覧オーバーロードの一覧

参照参照

関連項目

HMACSHA384 クラス
HMACSHA384 メンバ
System.Security.Cryptography 名前空間

その他の技術情報

暗号サービス

HMACSHA384 コンストラクタ ()

メモ : このコンストラクタは、.NET Framework version 2.0新しく追加されたものです。

ランダムに生成されキー指定して、HMACSHA384 クラス新しインスタンス初期化します。

名前空間: System.Security.Cryptography
アセンブリ: mscorlib (mscorlib.dll 内)
構文構文

public HMACSHA384 ()
public:
HMACSHA384 ()
public HMACSHA384 ()
解説解説
使用例使用例

HMACSHA384使用してファイルエンコードしたり、エンコード済みファイルデコードしたりする方法次のコード例示します

using System;
using System.IO;
using System.Security.Cryptography;

public class HMACSHA384example
{
    // Computes a keyed hash for a source file, creates a target file
 with the keyed hash
    // prepended to the contents of the source file, then decrypts the
 file and compares
    // the source and the decrypted files.
    public static void EncodeFile(byte[]
 key, String sourceFile, String destFile)
    {
        // Initialize the keyed hash object.
        HMACSHA384 myhmacsha384 = new HMACSHA384(key);
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);
        FileStream outStream = new FileStream(destFile, FileMode.Create);
        // Compute the hash of the input file.
        byte[] hashValue = myhmacsha384.ComputeHash(inStream);
        // Reset inStream to the beginning of the file.
        inStream.Position = 0;
        // Write the computed hash value to the output file.
        outStream.Write(hashValue, 0, hashValue.Length);
        // Copy the contents of the sourceFile to the destFile.
        int bytesRead;
        // read 1K at a time
        byte[] buffer = new byte[1024]; 
        do
        {
            // Read from the wrapping CryptoStream.
            bytesRead = inStream.Read(buffer,0,1024); 
            outStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0); 
        myhmacsha384.Clear();
        // Close the streams
        inStream.Close();
        outStream.Close();
        return;
    } // end EncodeFile


    // Decrypt the encoded file and compare to original file.
    public static bool DecodeFile(byte[]
 key, String sourceFile)
    {
        // Initialize the keyed hash object. 
        HMACSHA384 hmacsha384 = new HMACSHA384(key);
        // Create an array to hold the keyed hash value read from the
 file.
        byte[] storedHash = new byte[hmacsha384.HashSize/8];
        // Create a FileStream for the source file.
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);
        // Read in the storedHash.
        inStream.Read(storedHash, 0, storedHash.Length);
        // Compute the hash of the remaining contents of the file.
        // The stream is properly positioned at the beginning of the
 content, 
        // immediately after the stored hash value.
        byte[] computedHash = hmacsha384.ComputeHash(inStream);
        // compare the computed hash with the stored value
        for (int i =0; i < storedHash.Length;
 i++)
        {
            if (computedHash[i] != storedHash[i])
            {
                Console.WriteLine("Hash values differ! Encoded file has been
 tampered with!");
                return false;
            }
        }
        Console.WriteLine("Hash values agree -- no tampering occurred.");
        return true;
    } //end DecodeFile

    private const string
 usageText = "Usage: HMACSHA384 inputfile.txt encryptedfile.hsh\nYou must specify
 the two file names. Only the first file must exist.\n";
    public static void Main(string[]
 Fileargs)
    {
        //If no file names are specified, write usage text.
        if (Fileargs.Length < 2)
        {
            Console.WriteLine(usageText);
        }
        else
        {
            try
            {
                // Create a random key using a random number generator.
 This would be the
                //  secret key shared by sender and receiver.
                byte[] secretkey = new Byte[64];
                //RNGCryptoServiceProvider is an implementation of a
 random number generator.
                RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
                // The array is now filled with cryptographically strong
 random bytes.
                rng.GetBytes(secretkey); 

                // Use the secret key to encode the message file.
                EncodeFile(secretkey, Fileargs[0], Fileargs[1]);

                // Take the encoded file and decode
                DecodeFile(secretkey, Fileargs[1]);
            }
            catch (IOException e)
            {
                Console.WriteLine("Error: File not found",e);
            }
        } //end if-else

    }  //end main
} //end class
using namespace System;
using namespace System::IO;
using namespace System::Security::Cryptography;

// Computes a keyed hash for a source file, creates a target file with
 the keyed hash
// prepended to the contents of the source file, then decrypts the file
 and compares
// the source and the decrypted files.
void EncodeFile( array<Byte>^key, String^ sourceFile, String^
 destFile )
{
   
   // Initialize the keyed hash object.
   HMACSHA384^ myhmacsha384 = gcnew HMACSHA384( key );
   FileStream^ inStream = gcnew FileStream( sourceFile,FileMode::Open );
   FileStream^ outStream = gcnew FileStream( destFile,FileMode::Create );
   
   // Compute the hash of the input file.
   array<Byte>^hashValue = myhmacsha384->ComputeHash( inStream );
   
   // Reset inStream to the beginning of the file.
   inStream->Position = 0;
   
   // Write the computed hash value to the output file.
   outStream->Write( hashValue, 0, hashValue->Length );
   
   // Copy the contents of the sourceFile to the destFile.
   int bytesRead;
   
   // read 1K at a time
   array<Byte>^buffer = gcnew array<Byte>(1024);
   do
   {
      
      // Read from the wrapping CryptoStream.
      bytesRead = inStream->Read( buffer, 0, 1024 );
      outStream->Write( buffer, 0, bytesRead );
   }
   while ( bytesRead > 0 );

   myhmacsha384->Clear();
   
   // Close the streams
   inStream->Close();
   outStream->Close();
   return;
} // end EncodeFile



// Decrypt the encoded file and compare to original file.
bool DecodeFile( array<Byte>^key, String^ sourceFile )
{
   
   // Initialize the keyed hash object. 
   HMACSHA384^ hmacsha384 = gcnew HMACSHA384( key );
   
   // Create an array to hold the keyed hash value read from the file.
   array<Byte>^storedHash = gcnew array<Byte>(hmacsha384->HashSize
 / 8);
   
   // Create a FileStream for the source file.
   FileStream^ inStream = gcnew FileStream( sourceFile,FileMode::Open );
   
   // Read in the storedHash.
   inStream->Read( storedHash, 0, storedHash->Length );
   
   // Compute the hash of the remaining contents of the file.
   // The stream is properly positioned at the beginning of the content,
 
   // immediately after the stored hash value.
   array<Byte>^computedHash = hmacsha384->ComputeHash( inStream );
   
   // compare the computed hash with the stored value
   for ( int i = 0; i < storedHash->Length;
 i++ )
   {
      if ( computedHash[ i ] != storedHash[ i ] )
      {
         Console::WriteLine( "Hash values differ! Encoded file has been tampered
 with!" );
         return false;
      }

   }
   Console::WriteLine( "Hash values agree -- no tampering occurred." );
   return true;
} //end DecodeFile


int main()
{
   array<String^>^Fileargs = Environment::GetCommandLineArgs();
   String^ usageText = "Usage: HMACSHA384 inputfile.txt encryptedfile.hsh\nYou
 must specify the two file names. Only the first file must exist.\n";
   
   //If no file names are specified, write usage text.
   if ( Fileargs->Length < 3 )
   {
      Console::WriteLine( usageText );
   }
   else
   {
      try
      {
         
         // Create a random key using a random number generator. This
 would be the
         //  secret key shared by sender and receiver.
         array<Byte>^secretkey = gcnew array<Byte>(64);
         
         //RNGCryptoServiceProvider is an implementation of a random
 number generator.
         RNGCryptoServiceProvider^ rng = gcnew RNGCryptoServiceProvider;
         
         // The array is now filled with cryptographically strong random
 bytes.
         rng->GetBytes( secretkey );
         
         // Use the secret key to encode the message file.
         EncodeFile( secretkey, Fileargs[ 1 ], Fileargs[ 2 ] );
         
         // Take the encoded file and decode
         DecodeFile( secretkey, Fileargs[ 2 ] );
      }
      catch ( IOException^ e ) 
      {
         Console::WriteLine( "Error: File not found", e );
      }

   }
} //end main


import System.*;
import System.IO.*;
import System.Security.Cryptography.*;

public class HMACSHA384Example
{
    // Computes a keyed hash for a source file, creates a target file
 with 
    // the keyed hash prepended to the contents of the source file,
 then 
    // decrypts the file and compares the source and the decrypted files.
    public static void EncodeFile(ubyte
 key[], String sourceFile, 
        String destFile)
    {
        // Initialize the keyed hash object.
        HMACSHA384 myhmacsha384 = new HMACSHA384(key);
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);
        FileStream outStream = new FileStream(destFile, FileMode.Create);

        // Compute the hash of the input file.
        ubyte hashValue[] = myhmacsha384.ComputeHash(inStream);

        // Reset inStream to the beginning of the file.
        inStream.set_Position(0);

        // Write the computed hash value to the output file.
        outStream.Write(hashValue, 0, hashValue.length);

        // Copy the contents of the sourceFile to the destFile.
        int bytesRead;

        // read 1K at a time
        ubyte buffer[] = new ubyte[1024];

        do {
            // Read from the wrapping CryptoStream.
            bytesRead = inStream.Read(buffer, 0, 1024);
            outStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0);
        myhmacsha384.Clear();

        // Close the streams
        inStream.Close();
        outStream.Close();
        return;
    } // end EncodeFile
    
    // Decrypt the encoded file and compare to original file.
    public static boolean DecodeFile(ubyte
 key [], String sourceFile)
    {
        // Initialize the keyed hash object. 
        HMACSHA384 hmacsha384 = new HMACSHA384(key);

        // Create an array to hold the keyed hash value read from the
 file.
        ubyte storedHash[] = new ubyte[hmacsha384.get_HashSize()
 / 8];

        // Create a FileStream for the source file.
        FileStream inStream = new FileStream(sourceFile, FileMode.Open);

        // Read in the storedHash.
        inStream.Read(storedHash, 0, storedHash.length);

        // Compute the hash of the remaining contents of the file.
        // The stream is properly positioned at the beginning of the
 content, 
        // immediately after the stored hash value.
        ubyte computedHash[] = hmacsha384.ComputeHash(inStream);

        // compare the computed hash with the stored value
        for (int i = 0; i < storedHash.length;
 i++) {
            if (computedHash[i] != storedHash[i]) {
                Console.WriteLine("Hash values differ! Encoded file has been
 " 
                    + " tampered with!");
                return false;
            }
        }

        Console.WriteLine("Hash values agree -- no tampering occurred.");
        return true;
    } //end DecodeFile

    private static String usageText = "Usage:
 HMACSHA384 inputfile.txt " 
        + "encryptedfile.hsh\nYou must specify the two file names. Only the
 " 
        + "first file must exist.\n";

    public static void main(String[]
 fileargs)
    {
        //If no file names are specified, write usage text.
        if (fileargs.length < 2) {
            Console.WriteLine(usageText);
        }
        else {
            try {
                // Create a random key using a random number generator.
 This 
                // would be the secret key shared by sender and receiver.
                ubyte secretKey[] = new ubyte[64];

                // RNGCryptoServiceProvider is an implementation of
 a random
                // number generator.
                RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

                // The array is now filled with cryptographically strong
                // random bytes.
                rng.GetBytes(secretKey);

                // Use the secret key to encode the message file.
                EncodeFile(secretKey, fileargs[0], fileargs[1]);

                // Take the encoded file and decode
                DecodeFile(secretKey, fileargs[1]);
            }
            catch (IOException e) {
                Console.WriteLine("Error: File not found", e);
            }
        } //end if-else
    } //end main
} //end class HMACSHA384Example
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「HMACSHA384 コンストラクタ」の関連用語

HMACSHA384 コンストラクタのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



HMACSHA384 コンストラクタのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2024 Microsoft.All rights reserved.

©2024 GRAS Group, Inc.RSS