You can encrypt a message and store in your smart contract.
But to decrypt it, the only thing you can do is to make a call() to get encrypted data from the caller. It's a special function that will only read something on the smart contract.
You can't make a transaction with the private key as an argument but it will be FORBIDDEN because anyone would see the private key on the network and you will be hacked within secondes.
I don't see the point to store an encrypted message on the blockchain. But what you can do is using EIP712.
In our project (CryptoPuzzle.com) for token n°139 own by 0xDB59, I (address 0x28B9) made a bid to buy this token.
The bid is a signed message like this :
makerIds: Array 
takerIds: Array [ 139 ]
The important part is "sig" because it's EIP712 compatible so I can know that address 0x28b9 want to pay 10000000000000000 wei (0.01ETH) for token [ 139 ]. Please look at EIP712 to understand it.